Клод провел аудит своего исходного кода, вот краткое резюме выводов
На основе глубокого анализа кода объемом 2,200 файлов по всем четырем измерениям:
🔴 Уязвимости безопасности
1. Внедрение команд Windows (windowsPaths.ts)
Функция checkPathExists() создает команду оболочки, напрямую интерполируя строку пути, контролируемую пользователем:
execSync_DEPRECATED(`dir "${path}"`, { stdio: 'pipe' })
Путь, содержащий " или метасимволы оболочки (например, C:\foo" & evil), может выйти за пределы контекста с двойными кавычками и выполнить произвольные команды. Низкая эксплуатационная способность на практике (внутренняя утилита), но все еще небезопасно.
2. Нет защиты от SSRF с частными IP/localhost в WebFetchTool
isValidUrl() проверяет, что имя хоста имеет как минимум две части, разделенные точками — но не блокирует localhost, 127.0.0.1, 192.168.*, 169.254.*, или другие адреса RFC-1918/link-local. Проверка блокировки домена (checkDomainBlocklist) делегируется к api.anthropic.com/api/web/domain_info, что означает, что SSRF к внутренним/частным хостам полностью зависит от правильного отказа этого внешнего API. Сетевая ошибка возвращает check_failed, который может обрабатываться мягко. Защита глубины локальной проверки IP отсутствует.
3. JWT декодируется без проверки подписи (jwtUtils.ts)
decodeJwtPayload() явно удаляет префикс sk-ant-si- и декодирует полезную нагрузку JWT без проверки подписи. Используется для планирования обновления токена (чтение истечения). Если злоумышленник может заменить подделанный токен, он может манипулировать временем обновления. Низкий риск, учитывая, что токены получены от доверенной инфраструктуры Anthropic, но отсутствие проверки стоит отметить.
🟠 Обработка API ключей / секретов
4. Токен доступа сессии хранится в памяти в нескольких местах
Значения session_ingress_token передаются как простые строки и хранятся в sessionIngressTokens (Map) в bridgeMain.ts. Токены появляются в отладочных логах с редактированием префикса (token.slice(0, 15)…) — но редактирование логов осуществляется вручную и применяется непоследовательно. Любое будущее изменение в логах может непреднамеренно раскрыть полные токены.
5. CLAUDE_CODE_CLIENT_KEY и CLAUDE_CODE_CLIENT_KEY_PASSPHRASE в окружении
Эти чувствительные переменные окружения существуют как документированные параметры конфигурации. Если они появляются в списках процессов, /proc/self/environ или захватываются инструментами, они становятся доступными. В BashTool есть проверка безопасности validateProcEnvironAccess, которая блокирует чтения /proc/*/environ — хорошо — но это применимо только к командам bash, выданным Claude, а не к произвольной инспекции процессов.
6. Нет явного обнуления секретов
Декодированные секреты из decodeWorkSecret() и токены, хранящиеся в мосту, никогда не обнуляются/не зануляются явно после использования. В JavaScript это в основном проблема сборки мусора V8, но секреты могут оставаться в памяти кучи и появляться в дампах при сбое.
🟡 Конфиденциальность данных / Телеметрия
7. Отключение телеметрии не является стандартным
Аналитика включена по умолчанию и требует явной настройки переменной окружения (DISABLE_TELEMETRY=1 или CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1). События направляются как в Datadog, так и в 1P логирование событий Anthropic. Тип маркера AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS является типом never — что означает, что он не может на самом деле предотвратить запись строковой метадаты в логи; это обеспечивается конвенцией и кодом проверки, а не системой типов.
8. Обмен транскриптом по обратной связи
submitTranscriptShare.ts отправляет полную историю разговора (нормализованные сообщения + необработанный JSONL транскрипт + транскрипты подагентов) в Anthropic по обратной связи по опросу, включая вызов redactSensitiveInfo(), чей объем неясен. Это происходит как при негативных, так и при позитивных триггерах обратной связи. Пользователи могут не полностью понимать, что содержимое транскрипта загружается.
9. ПОЛЯ PII PROTO идут в 1P Logging
Шаблон ключа PROTO* направляет значения с тегами PII в "привилегированный столбец" в BigQuery с ограниченными контрольными доступами. Дизайн хорош, но полностью зависит от вызова stripProtoFields() в sink.ts перед каждым не-1P sink. Один пропущенный вызов направит неотредактированные PII в бэкенд общего доступа.
🔵 Качество кода / Архитектура
10. Обширное использование устаревших API
177 call sites reference DEPRECATED-suffixed functions (primarily execSyncDEPRECATED, splitCommand_DEPRECATED). Основная замена (дерево-синтаксический путь AST) ограничена доступностью — устаревший путь regex остается резервным вариантом для всех проверок безопасности. Эта сложность двойного пути представляет собой долгосрочный риск обслуживания.
11. 663 Пустых блоков catch {}
Существует большое количество паттернов поглощения ошибок. Многие из них намеренные (операции с наилучшим усилием, такие как записи кэша), но другие скрывают значительные сбои тихо. Примечательно, что блок catch checkDomainBlocklist возвращает check_failed с ошибкой, что хорошо — но многие вызывающие функции обрабатывают check_failed снисходительно.
12. 940 Вызовов void с fire-and-forget
Широкое использование void asyncFunction() означает, что многие ошибки асинхронных операций тихо игнорируются. Аналитика, записи телеметрии и некоторые операции сессии все используют этот паттерн.
13. 142 TODO/FIXME/HACK комментариев
Указывает на значительный технический долг, хотя некоторые из них аннотированы как безопасность (хорошо документированный анализ атак в bashSecurity.ts на самом деле является положительным).
14. bashSecurity.ts отличен, но хрупок из-за регулярных выражений
Код проверки безопасности оболочки чрезвычайно детализирован — охватывает инъекцию IFS, пробелы Юникода, различия в возвратах каретки, расширение фигурных скобок, обходы, специфичные для Zsh, и т. д. Однако путь _DEPRECATED regex (используемый, когда tree-sitter недоступен) по своей природе хрупок. Команда задокументировала более 20 известных классов обхода; вероятно, есть неоткрытые крайние случаи.
Сводная таблица
Вот чистая переписанная версия без какой-либо таблицы форматирования:
Резюме
Безопасность — 🔴 Высокий: Уязвимость инъекции в директории Windows "${path}"
Безопасность — 🔴 Высокий: Нет защиты от localhost/private IP SSRF
Безопасность — 🟠 Средний: JWT декодируется без проверки его подписи
Секреты — 🟠 Средний: Токены доступа раскрыты в памяти/логах
Секреты — 🟠 Средний: Клиентский ключ и пароль хранятся через переменные окружения
Секреты — 🟡 Низкий: Нет обнуления памяти для конфиденциальных данных
Конфиденциальность — 🟠 Средний: Телеметрия по умолчанию не отключена
Конфиденциальность — 🟠 Средний: Обратная связь может вызвать неявные загрузки транскриптов
Конфиденциальность — 🟡 Низкий: Обработка PII зависит от единого вызова stripProtoFields
Качество — 🟠 Средний: 177 устаревших мест вызова функций
Качество — 🟡 Низкий: 663 пустых блоков catch
Качество — 🟡 Низкий: 940 вызовов async без ожидания
Качество — 🟡 Низкий: 142 TODO/FIXME элемента
Качество — 🟡 Низкий: Хрупкое использование regex в путях, чувствительных к безопасности
https://t.co/jBiMoOzt8G