Зміст
Коротко
Код від GitHub Copilot і Claude Code часто виглядає готовим до запуску — і саме тому в прод їдуть ті самі класи дірок. На Dev.to інженер Джітендра Роут описує сім повторюваних шаблонів: не «дурні помилки моделі», а наслідок того, що асистент оптимізує правдоподібний робочий приклад, а не безпечну продакшен-збірку. Він виклав відкритий сканер ai-vuln-scan і каталог шаблонів, щоб ловити цей розрив системно, а не сподіватися на «кращий промпт».
Що сталося
Автор помітив, що дірки в коді з ШІ не випадкові. Універсальні лінтери шукають вади взагалі; тут питання вже: які промахи частіше, ніж у коді, написаному людиною з нуля. Відповідь проста: приклад «щоб завелося» не потребує менеджера секретів, параметризованого запиту й жорсткого конфігу. Модель видає версію, яка працює. Безпечна з’являється, лише якщо про це явно попросити.
Сім шаблонів з відкритого каталогу:
| Шаблон | Як виглядає «зручний приклад» | Що має бути в проді |
|---|---|---|
| Секрети в коді | Ключ API «для демо» копіюють як є | Змінні середовища, сховище секретів |
| Склейка запиту | SELECT … WHERE id = ${userId} |
Параметри / плейсхолдери драйвера |
| Команда оболонки | exec("cmd " + arg) |
execFile() зі списком аргументів |
| Надто відкритий конфіг | CORS *, вимкнена перевірка сертифіката |
Явний список джерел, перевірка увімкнена |
| Слабка криптографія | MD5, Math.random() «для токена» |
Нормальні примітиви для безпеки |
| Різний доступ на схожих маршрутах | Новий маршрут «як сусідній», без шару перевірки | Той самий проміжний шар, що в інших |
| Докладні помилки клієнту | err.stack у відповіді HTTP |
Журнал на сервері, загальна фраза клієнту |
Шостий пункт автор вважає найхарактернішим саме для ШІ. Людина, копіюючи маршрут, тягне блок цілком. Модель заново генерує опис — і крок із перевіркою доступу легко випадає, особливо якщо правки йшли в різних запитах. У рев’ю кожна функція окремо виглядає нормально. У матеріалі є показовий обробник Express: маршрут замовлень користувача, який на перший погляд лише читає id з адреси й віддає JSON. Якщо в тому самому файлі інші маршрути обгорнуті в шар перевірки доступу, а цей — ні, дірка не кричить синтаксисом. Вона виглядає як «ще один простий маршрут».
На навчальному файлі з навмисно вставленими дірками ai-vuln-scan знайшов 12 спрацювань (секрети, склейка запитів, маршрут без доступу, слабкий генератор токена) і не дав хибних на тих самих маршрутах після правки. Зараз покриті JavaScript, TypeScript і Python на регулярках і простій структурі коду; далі автор хоче дерево розбору з відстеженням потоку даних і розмічений набір прикладів. Каталог шаблонів він публікує окремо від сканера: новий шаблон можна описати й обговорити, ще не маючи правила детекції. Це важливо, бо зоопарк асистентів змінюється швидше, ніж набір регулярних виразів.
Чому це важливо
Команди вже вбудовують асистентів у щоденну роботу. Рев’ю досі читає «чи виглядає функція розумно», а не «чи не випав шар доступу під час регенерації». Звичайні плагіни безпеки для лінтера, Bandit і Semgrep частину цього ловлять — але без рамки «це типовий артефакт ШІ». Іменований каталог дає спільну мову для рев’ю і для правил у конвеєрі: можна сперечатися з конкретним шаблоном, а не з відчуттям, що «модель іноді ворожа».
Є й організаційний ефект. Якщо в команді вже прийнято «не комітити ключі» і «не клеїти SQL рядками», каталог усе одно корисний як список місць, де асистент найчастіше обходить ці правила «заради робочого прикладу». Секрети у вигляді правдоподібного ключа, CORS * «щоб завелося локально», MD5 «просто порахувати хеш» — це не нова теорія безпеки, а статистика того, що модель вважає достатньо доброю відповіддю на короткий запит.
Окремий сканер не замінює нормальну архітектуру доступу. Він закриває сліпу зону: правдоподібний приклад, який пройшов компілятор і побіжний погляд.
На практиці
- У рев’ю нового маршруту звіряйте проміжний шар доступу із сусідніми: якщо асистент «додавав ще один як інші», саме тут найчастіше дірка.
- Забороніть у політиці репозиторію ключі й рядки підключення в початковому коді, навіть «тимчасові» й «демо».
- Шукайте склейку SQL і команд оболонки через шаблонні рядки; вимагайте параметри й масив аргументів.
- Не залишайте в конфігу розробки
CORS *, вимкнену перевірку сертифіката й режим налагодження — асистент не знає ваших реальних джерел і сертифікатів. - Для хешів паролів і токенів сесії не приймайте
MD5іMath.random()навіть у «чорновому» патчі. - Помилки: стек — лише в журнал сервера; клієнту — нейтральне повідомлення й код.
- Проженіть
ai-vuln-scan(клонувати репозиторій,npm run scan:examples) і вирішіть, чи вбудовувати його поруч ізSemgrep, а не замість нього.
Підсумок
Дірки в коді від ШІ передбачувані: модель пише приклад, який запускається, а не збірку, яку можна викатувати. Сім шаблонів і вузький сканер не скасовують рев’ю — вони дають імена й автоматичну сітку там, де людина найгірше помічає випалий шар доступу. Промпт «зроби безпечно» допомагає точково; системно працює перевірка за каталогом.


