Създаване на безплатен акаунт
Сигурност на кода на LLM приложения

Изходът на вашия модел е недоверен вход. Намерете къде кодът ви забравя това.

Статичен анализ на кода около вашия LLM — кодът, който изгражда промпта, извиква модела и прави нещо с отговора. Не на модела. Не на устойчивостта на промпта срещу jailbreak. На кода.

Безплатният план покрива 3 проекта и 30 анализа месечно, без ограничение за броя потребители и без банкова карта. Този анализ се побира в него.

Проблемът

Моделът не е библиотека. Той е недоверен интерпретатор: подавате му низ и той ви връща друг. Всичко, което е повлияло на този низ — собственият промпт на потребителя, страница, която му е била показана, документ, който е получил, резултат от друг инструмент — е повлияло и на отговора.

Отговорът е безобиден, докато кодът не му даде способност да действа. Опасността не е, че моделът е казал нещо; опасността е, че програмата му е повярвала. Всяко място, където програма третира генериран текст като код, като команда, като заявка, като път или като URL, е инжекция през още един скок — и за разлика от въпроса дали промптът може да бъде заобиколен с jailbreak, този скок се вижда в изходния код.

Какво търси Cybseco

Там, където изходът на модела стига до нещо, което действа. Това са собствените категории, степени на сериозност и CWE идентификатори на машината.

Изпълнение на код — CWE-94
критична
eval, exec, compile, new Function, pickle.loads, yaml.load — отговорът се превръща в програма.
Обвивка — CWE-78
критична
os.system, subprocess, child_process.exec, execSync — отговорът се превръща в команда.
SQL заявка — CWE-89
висока
execute, raw, createQuery — text-to-SQL е точно този модел, а DROP TABLE е правдоподобно продължение.
Път във файловата система — CWE-22
висока
open, readFile, shutil.rmtree, unlink — ../../etc/passwd е също толкова правдоподобно продължение.
Изходяща заявка — CWE-918
висока
requests, httpx, fetch, axios, urlopen — подправяне на заявка от страна на сървъра, избрано от модела.

Конкретен пример

Девет реда и цялата форма на риска.

from openai import OpenAI
client = OpenAI()

def run_plan(task: str):
    answer = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": task}],
    )
    exec(answer.choices[0].message.content)
Източник
client.chat.completions.create(…) — извикване, което връща изход на модела. Анализаторът свързва променливата, на която е присвоен, и точно това му позволява да проследи стойността през функцията без междупроцедурен анализ.
Поток
answer съдържа текст, повлиян от нападател. Между извикването и приемника нищо не го проверява, не го ограничава и не го свежда до фиксиран набор операции.
Приемник
exec(…) — текстът се превръща в програма в самия процес на приложението, с неговите удостоверения, неговата мрежа и неговата файлова система.
Защо има значение
Всичко, което може да повлияе на task — пряко или чрез документ, показан на модела — избира какво ще се изпълни. Това е отдалечено изпълнение на код през още един скок.

Изпълнен срещу текущата машина, този откъс дава една констатация: llm-output-to-code-execution, CWE-94, сериозност критична, увереност висока, на реда exec. Увереността е висока, защото променливата е свързана с действително completion извикване. Име, което само прилича на отговор от модел — llm_response, reply — се докладва със средна увереност, защото това е предположение, а да се твърди друго би било лъжа за доказателството.

Какво не е това

Не е тест на модела
Не сондираме модела, не провеждаме red teaming срещу него и не оценяваме как се държи под натиск. Нищо тук не казва дали промптът може да бъде заобиколен с jailbreak: това не може да се реши от изходния код, а да се твърди би било точно онзи вид изявление, заради чието избягване съществува тази машина.
Не е пълно откриване на промпт инжекция
Непряката инжекция се докладва там, където недоверено съдържание доказуемо стига до промпт. Канал, който не виждаме в кода, е канал, който не докладваме.
Не е гаранция за агент
Докладваме, че на агент е предоставен инструмент, който изпълнява код или команди. Какво прави агентът след това по време на изпълнение, е извън това, което статичният анализ може да реши.
Допълва сигурността на ИИ по време на изпълнение
Предпазните механизми, оценъчните стендове и red teaming отговарят на въпроси, на които това не може, а това отговаря на въпроси, на които те не могат. Нито едното не замества другото.

Други специфични за LLM рискове в кода

Всеки от тях беше задействан върху проба срещу текущата машина, преди да бъде записан тук.

Тайни и лични данни, вмъкнати в промпт — CWE-200
api_key, парола, IBAN или медицински запис, поставени в текста, който изпращате. Докладва се там, където наистина се изгражда контекст на промпт, а не при всеки f-низ, който случайно съдържа ключ.
Агент с инструмент, който изпълнява код или команди — CWE-250
PythonREPLTool, ShellTool, интерпретатор на код, терминал. Предоставянето на който и да е от тях превръща всеки въпрос за промпт инжекция във въпрос за отдалечено изпълнение на код.
Защита на рамката, върната в изключено положение — CWE-502
allow_dangerous_deserialization=True, trust_remote_code=True, dangerouslyAllow… — рамката я е изключила, защото е била опасна.
Изключени контроли за безопасност на доставчика — CWE-693
BLOCK_NONE, safety_settings=None, moderation=false.
Промпт или дефиниция на агент, изтеглени по време на изпълнение — CWE-829
hub.pull(…), шаблон за промпт, зареден по HTTP. Който контролира тази крайна точка, контролира инструкциите.
Недоверено съдържание, заредено направо в промпт — CWE-77
Извлечена страница, PDF, хранилище, уики. Това е каналът на непряката инжекция, разпознат по това откъде е дошъл текстът, а не по това какво казва.
API ключ на модел, записан в изходния код — CWE-798
sk-…, sk-ant-…, AIza…, hf_…, подадени в хранилището.
Изтеглен от употреба или заменен модел, фиксиран в кода — CWE-1104
text-davinci-*, gpt-4-0314, claude-instant — по-слаба йерархия на инструкциите, без отделяне на системния промпт.

Защо да вярвате на нещо от това

Публикуван benchmark
Прецизност, пълнота и F1 по CWE, по език и по слой на анализ, върху версиониран, ръчно означен корпус. Вижте числата.
Публикуван обхват
Всеки слой, който не измерваме, е назован, с причината. Прочетете методологията.
Проверка върху публичен код
Анализирани хранилища и комити, срещнати езици, дял на завършените и детерминизъм — обеми и дялове, а не твърдения за точност. Вижте изпълненията.
Всяка констатация носи своето доказателство
Файлът, редът, откритата конструкция и CWE. Констатация, която не можете да проверите, е констатация, по която не бива да действате.

Независим от доставчика по конструкция. Анализаторът разпознава формата — нещо произвежда текст, нещо го потребява — а не изписването на един конкретен SDK. Назовава рамката, която е видял, когато може (OpenAI, Anthropic, Google, Azure OpenAI, Mistral, Bedrock, Ollama, LiteLLM, LangChain, LangGraph, LlamaIndex, Semantic Kernel, AutoGen, CrewAI, Hugging Face), за да може констатацията да каже откъде идва. Това е етикет върху констатацията, а не интеграция за всеки SDK, и рамка, която липсва в този списък, се анализира по точно същия начин.

Вижте как Cybseco разсъждава за реална система

Гледайте интерактивното демо, след което заявете насочен пробен период за вашия екип.