← Усі статті

Сім дірок, які ШІ частіше вставляє в код — і як їх ловити

Чому асистенти генерують «правдоподібний приклад», а не прод: секрети в коді, SQL-склейка, дірки в доступі. Таксономія і сканер ai-vuln-scan.

Сім дірок, які ШІ частіше вставляє в код — і як їх ловити
Зміст

Коротко

Код від 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 «просто порахувати хеш» — це не нова теорія безпеки, а статистика того, що модель вважає достатньо доброю відповіддю на короткий запит.

Окремий сканер не замінює нормальну архітектуру доступу. Він закриває сліпу зону: правдоподібний приклад, який пройшов компілятор і побіжний погляд.

На практиці

  1. У рев’ю нового маршруту звіряйте проміжний шар доступу із сусідніми: якщо асистент «додавав ще один як інші», саме тут найчастіше дірка.
  2. Забороніть у політиці репозиторію ключі й рядки підключення в початковому коді, навіть «тимчасові» й «демо».
  3. Шукайте склейку SQL і команд оболонки через шаблонні рядки; вимагайте параметри й масив аргументів.
  4. Не залишайте в конфігу розробки CORS *, вимкнену перевірку сертифіката й режим налагодження — асистент не знає ваших реальних джерел і сертифікатів.
  5. Для хешів паролів і токенів сесії не приймайте MD5 і Math.random() навіть у «чорновому» патчі.
  6. Помилки: стек — лише в журнал сервера; клієнту — нейтральне повідомлення й код.
  7. Проженіть ai-vuln-scan (клонувати репозиторій, npm run scan:examples) і вирішіть, чи вбудовувати його поруч із Semgrep, а не замість нього.

Підсумок

Дірки в коді від ШІ передбачувані: модель пише приклад, який запускається, а не збірку, яку можна викатувати. Сім шаблонів і вузький сканер не скасовують рев’ю — вони дають імена й автоматичну сітку там, де людина найгірше помічає випалий шар доступу. Промпт «зроби безпечно» допомагає точково; системно працює перевірка за каталогом.