Command injection в Claude Code: извлекаем правильные уроки 🤖
Исследователь из Flatt Security нашел
8 способов обхода белых списков команд в Claude Code. Его подход можно и нужно использовать при поиске багов в веб-приложениях ⤵️
Под капотом Claude Code использовал регулярные выражения, которые разрешали «безопасные» команды вроде
man,
sort,
sed,
xargs. Каждый обход эксплуатировал одно из следующих свойств:
1️⃣
Опасные флаги в «безопасных» командах🧡
man --html='touch /tmp/pwned' man — флаг
--html задаёт рендерер, который выполняет произвольные команды
🧡
sort --compress-program=/bin/sh — флаг утилиты сжатия принимает исполняемые файлы
🧡
echo test | sed 's/test/touch \/tmp\/pwned/e' — модификатор
e выполняет shell-команды.
2️⃣
Сокращение аргументов в Git🧡 Git автоматически дополняет сокращённые флаги:
--upload-pa превращается в
--upload-pack🧡 Regex-фильтры проверяют точные имена флагов
🧡
git ls-remote --upload-pa='...' обходит блокировку
--upload-pack3️⃣
Различная интерпретация аргументов команды🧡
xargs -t touch echo — regex считает, что
-t обрабатывает следующий аргумент, но
-t является логическим значением
🧡 В итоге
touch становится исполняемой командой, а не аргументом для
-t4️⃣
Расширение prompt в Bashecho ${one="$"}${two="$one(touch /tmp/pwned)"}${two@P}Модификатор
@P интерпретирует переменную как строку промпта, который поддерживает подстановку команд.
В сочетании с присваиванием
$ это позволяет вырваться из ограниченных контекстов, например при установке переменной
one в
$.
💬
Какой вывод можно сделать?Любой контроль, основанный на проверке строк или «разрешённых значений», часто ломается на реальном поведении системы.
Если приложение фильтрует параметры, команды, пути, роли или действия через regex, списки допустимых значений или «безопасные» флаги — ищи расхождение между тем, что проверяет код, и тем, как это интерпретирует движок дальше.
И да: всегда читай документацию целиком. Большинство обходов лежат в man-страницах и спецификациях — просто до них никто не дошёл.