Единица 11 / 12

Проверка кода, уязвимости и риски вывода ИИ

Прибыль:

  • Возможность проверки результатов ИИ на трех уровнях: точность, безопасность и источник/лицензия.
  • Возможность скрыть такие риски, как инъекции, пакеты с галлюцинациями и скрытые секреты, с помощью безопасных форм и инструментов.
  • Способность представить критически важный для безопасности код на утверждение компетентного инженера и понять непередаваемость ответственности.

Генерировать код ИИ легко; Доверять ему дорого. Единственная цель этого модуля — превратить принцип «проверки», который мы повторяли во всех предыдущих модулях, в систематическую инженерную дисциплину. Потому что код, созданный ИИ, даже если он на первый взгляд кажется правильным, несет в себе три отдельные опасности: быть нерабочим/неправильным (галлюцинация), быть небезопасным (уязвимость) и нести юридические/лицензионные риски. Знание этих троих и установление двери для каждого из них сделает вас профессионалом.

Здесь мы рассматриваем «проверку» на трех уровнях: корректность (действительно ли код выполняет свою работу?), безопасность (выдерживает ли он вредоносный ввод?) и происхождение/лицензию (имею ли я право использовать этот код?). На каждом уровне есть свои средства контроля, и ни один из них невозможно обойти с помощью «так сказал ИИ».

Три уровня риска

1. Риск точности (галлюцинации). Модель может вызывать несуществующую функцию, неправильно использовать API, молча обходить крайний случай. Код выглядит «разумным», но он неверен. Противоядие: компиляция, тестирование, статический анализ и визуальный осмотр.

2. Риск безопасности. ИИ может повторять небезопасные шаблоны в обучающих данных: запрос, уязвимый для внедрения SQL, неаутентифицированный пользовательский ввод, слабое шифрование, небезопасная десериализация, открытое перенаправление. Код работает, но уязвим для атак. Противоядие: проверка безопасности, автоматизированные сканеры (SAST) и внедрение известных шаблонов безопасности.

3. Риск источника/лицензии. ИИ может выдавать выходные данные, очень похожие на код, защищенный авторским правом или с ограниченной лицензией, или может предполагать ненадлежащую лицензированную зависимость. Противоядие: проверка зависимостей и лицензий, проверка оригинальности, корпоративная политика.

Внимание: самым коварным из этих трех рисков является безопасность; потому что код может пройти тестирование, бесперебойно работать в рабочей среде, а уязвимость обнаруживается только тогда, когда ее обнаруживает злоумышленник. «Работать» — это не то же самое, что «безопасно».

Шаг за шагом: шлюз многоуровневой аутентификации

  1. Читайте с пониманием. Действительно поймите код, прежде чем принять его; Не объединяйте код, который вы не понимаете. Если вы не можете объяснить, «почему это работает», значит, это еще не проверено.
  2. Убедитесь, что он существует. Убедитесь, что каждая используемая функция, API и пакет действительно существует и используется правильно (ворота галлюцинации).
  3. Запускайте автоматизированные инструменты. Компилятор, линтер (сканер стилей/ошибок), проверка типов, модульные тесты и, если возможно, SAST (статическое тестирование безопасности приложений — инструмент, который сканирует исходный код на наличие уязвимостей).
  4. Посмотрите на это с точки зрения безопасности. Введенные данные проверены? Параметризован ли запрос? Тайна похоронена? Есть ли контроль авторизации?
  5. Проверьте источник и лицензию. Лицензируются ли новые зависимости? Вывод слишком похож на известную кодовую базу?
  6. Если это критично для безопасности, попросите одобрение эксперта. Независимая проверка инженером, компетентным в таких областях, как аутентификация, оплата, криптография, контроль доступа, является обязательной.

Три мини-кейса

Случай 1 — SQL-инъекция обнаружена на контрольных воротах. Код, сгенерированный ИИ, который объединяет вводимые пользователем данные непосредственно в SQL-запрос для конечной точки поиска ("... WHERE name = '" + q + "'"). Код работал и прошел проверку. Проверка безопасности и сканирование SAST выявили это; Он был преобразован в параметризованный запрос (подготовленный оператор). Если бы она не была обнаружена, это была бы классическая уязвимость утечки данных.

Случай 2 — Пакет галлюцинаций. ИИ предложил несуществующий пакет npm (fast-safe-parse) для задачи. Когда разработчик попытался установить его, пакет не был найден. Хуже того: в некоторых случаях злоумышленники могут заполнить такие «призрачные» имена пакетов реальными вредоносными пакетами (путаница зависимостей). Урок: проверяйте каждый рекомендуемый пакет на соответствие официальному реестру и истории загрузок/обслуживания.

Случай 3 — Несовместимость лицензий. У изящной сопутствующей библиотеки, предложенной AI, была строгая лицензия с авторским левом, несовместимая с лицензией на продукт учреждения. Сканирование лицензии зависимостей сообщило об этом; Команда заменила лицензию на подходящую альтернативу. Без проверки возникло бы юридическое бремя при распространении продукции.

Четыре копируемых шаблона

Самоконтроль перед госпиталем:

Прежде чем принять следующий код, сгенерированный ИИ, проверьте: 1) Все ли используемые им функции/API/пакеты действительно существуют? Пометьте подозреваемых. 2) Есть ли непроверенные входные данные, конкатенация SQL/команд, скрытый секрет, слабая криптография? 3) Каковы неустраненные ошибки или крайние случаи? Пометьте каждый результат как «определенный/вероятный» и предложите исправления. {{code}}

Обзор, ориентированный на безопасность:

Проверьте этот код с помощью системы безопасности. Ищите распространенные уязвимости в стиле OWASP: внедрение, нарушение аутентификации/авторизации, раскрытие конфиденциальных данных, небезопасная десериализация, перенаправление без аутентификации. По каждому факту: риск, сценарий эксплуатации, меры по устранению. Это предварительный просмотр; передать важные выводы на рассмотрение службы безопасности человека.{{code}}

Проверка зависимостей и лицензии:

Перечислите зависимости, добавленные/предложенные этим кодом. Для каждого: существует ли пакет на самом деле, поддерживается ли он, какова будет его типичная лицензия (ДОЛЖНА БЫТЬ ПРОВЕРЕНА), и действительно ли он необходим для проекта или это можно сделать с помощью существующего инструмента? {{код или список зависимостей}}

Безопасная опалубка (в производстве):

Напишите код для {{task}}. ОБЯЗАТЕЛЬНЫЕ правила безопасности: - Проверяйте/дезинфицируйте все внешние входные данные. - Используйте только параметризованные запросы при доступе к базе данных. - Не встраивайте секреты в код; предположим, что переменная среды/секретный менеджер — не проглатывайте ошибки; Рассмотрите это осмысленно. Объясните, как код соответствует этим правилам в 3-х пунктах.

Слабая подсказка / Сильная подсказка

Слабое: «Напишите запрос, который ищет по имени пользователя». (Может возникнуть код, уязвимый для внедрения.)
Сильный: «Напишите функцию, которая выполняет поиск по имени пользователя. Никогда не объединяйте вводимые пользователем данные в запрос в виде строки; используйте параметризованный запрос (подготовленный оператор). Проверьте ввод на длину и символы. Объясните в 2 предложениях, почему код закрыт для внедрения».

Сильная версия с самого начала навязывает безопасный шаблон; Таким образом, он гарантирует, что уязвимость вообще не возникнет, а не обнаружит ее позже. Однако важно передать сгенерированный код через шлюзы проверки.

Уровень аутентификации

Инструмент/метод

Достаточно ли «ИИ сказал»?

точность

Сборка, тестирование, визуальный осмотр

нет

Реальность API/пакета

Официальный документ/контроль записей

нет

Безопасность

SAST, проверка безопасности

нет

Лицензия/источник

Проверка зависимостей и лицензий

нет

Критическая для безопасности логика

Утверждение экспертного инженера

Абсолютно нет

Ответственность не может быть передана

Ответственность за ошибки, уязвимости или нарушения, возникающие в коде, созданном инструментом ИИ, лежит на команде, которая собирает и распространяет этот код, а не на поставщике инструмента. Это профессиональный факт, а также юридический: вы подписываете. Так что фраза «это создал ИИ» — это не оправдание, а оправдание дополнительной осторожности. Выходные данные ИИ ни при каких обстоятельствах не заменяют проверку и одобрение квалифицированного инженера, особенно в системах, критически важных для безопасности; В лучшем случае ИИ предоставляет проект, который ускоряет работу инженера.

Совет: создайте в своей команде краткий контрольный список, который вы назовете «воротами проверки кода, сгенерированного ИИ» (сборка + тестирование + сканирование безопасности + визуальная проверка). Как только эти ворота войдут в привычку, потеря скорости будет минимальной, а снижение риска максимальным.

Распространенные ошибки

  • Путаете «работает» и «безопасно». Код, прошедший тестирование, может быть уязвим для атак.
  • Использование пакета/API без его проверки. Галлюцинаторные пакеты одновременно повреждают и представляют угрозу безопасности.
  • Обход автоматизированных инструментов. Линтер, проверка типов и SAST дешево улавливают то, что упускают люди.
  • Игнорирование лицензии. Неправильная лицензионная зависимость создает юридическое бремя для распространения.
  • Возложение ответственности на автомобиль. Команда отвечает за код в производстве; «Это сделал ИИ» не является оправданием.

В заключение

Принятие результатов ИИ требует трех уровней проверки: правильность (компиляция, тестирование, визуальная проверка), безопасность (SAST и проверка, ориентированная на безопасность) и источник/лицензия (проверка зависимостей). Убедитесь, что каждый используемый пакет и API действительно существуют, с самого начала применяйте шаблоны безопасности и отправляйте критически важный для безопасности код на утверждение квалифицированному инженеру. «Работает» не означает «безопасно», а «произведено ИИ» не снимает ответственности. Ворота проверки — это цена профессионализма, а не скорости.

Задача приложения

Намеренно дайте ИИ задачу, чувствительную к безопасности (например, «функцию, которая ищет в базе данных с помощью пользовательского ввода»), на этот раз без навязывания безопасного шаблона. Пропустите входящий код через шаблоны «самопроверки перед поступлением» и «проверки, ориентированной на безопасность»: есть ли какие-либо инъекции, скрытый секрет, галлюцинаторный пакет или неаутентифицированный ввод? Затем снова задайте ту же задачу с помощью шаблона «безопасное наложение шаблона» и сравните два результата. Если возможно, запустите инструмент linter/SAST и сравните результаты с саморегулированием ИИ.

контрольный список

  • [ ] Я проверяю результаты ИИ на трех уровнях: точность, безопасность и лицензия.
  • [ ] Я подтверждаю, что каждая используемая функция, API и пакет действительно существуют.
  • [ ] Я запускаю инструменты компиляции, тестирования, линтера и, если возможно, SAST.
  • [ ] Я с самого начала применяю безопасные шаблоны (параметризованный запрос, проверка ввода, управление секретами).
  • [ ] Я проверяю лицензирование и необходимость новых зависимостей.
  • [ ] Я отправляю критически важный для безопасности код на утверждение компетентному инженеру и понимаю, что несу ответственность.