
Детерминированный каркас и руководство для автономных offensive LLM-агентов, обеспечивающие соблюдение авторизации, границ области и контрольных точек сбора доказательств для воспроизводимого и честного тестирования на проникновение.
Детерминированный каркас для автономных наступательных агентов. Модель остаётся вероятностной. Хост-приложение владеет авторизацией, разрешёнными действиями, записями доказательств и приёмкой. Воспроизведение замороженных входных данных и политики может воспроизвести эти управленческие решения; оно не делает живой целевой объект или ответ модели воспроизводимыми.
python3 -m pip install -r requirements.txt
python3 -m harness.demo --out /tmp/harness-report.json
diff -u harness/report.json /tmp/harness-report.json
python3 -m pytest tests/test_harness.py
Данный релиз проверен на CPython 3.14. Более ранние версии Python не являются частью доказательств релиза; если вы используете одну из них, выполните полную последовательность проверок ниже, прежде чем полагаться на результат.
Стройте поэтапно: Ограничьте границу побочных эффектов и порядок стадий; Опишите цель через измеренные факты и каталоги; Докажите утверждения через захваты и независимые предикаты политики; Контролируйте и учитывайте авторизацию, шлюзы, завершение и невыполненную работу. Порядок разработки не является порядком выполнения: авторизация и шлюз предшествуют диспетчеризации.
Публичная лаборатория не выполняет сетевых запросов и не вызывает модель. Её предикат доказательства синтетический, её хост и адаптеры считаются доверенными, и каждая находка помечена как требующая проверки человеком. Лаборатория не реализует рабочий процесс принятия или подписания отчёта человеком. Дословная цитата устанавливает целостность цитирования, а не эксплуатируемость. Меньше вызовов модели и меньше переделок — это проектные цели, а не экономия, измеренная корпусом.
Главы ниже описывают более раннюю реализацию core/ и walkthrough/ и её опубликованные дефекты. Отсутствующий в ней верификатор вызовов модели остаётся отсутствующим и на этом историческом пути. Новый пакет harness/ — это отдельный офлайн-эталон контроля; он не исправляет задним числом корпус или исторические модули. Прочитайте границы и исправления главы 07, прежде чем копировать исторический компонент.
Наведите способную модель на хост, дайте ей набор инструментов и скажите провести тест на проникновение — и она сделает что-то разумное. Запустите её снова завтра — и она сделает что-то другое разумное, и ни один из запусков не скажет вам, почему она пропустила то, что поймал другой. Это руководство выступает за меньшую задачу для модели: отдавайте каждое решение самому дешёвому слою, который может принять его правильно, и расходуйте вычислительную мощность модели только там, где ответ действительно не выводим из того, что у вас уже есть. Этот порядок — от решений, которые может принять таблица, до тех немногих, что требуют модели, — и есть градиент из названия главы 00. Главы следуют за работающим агентом наступательной безопасности и за контролем, которого потребовали его сбои.
Историческая система имеет два пути оркестрации. На серверном пути оркестратор ведёт собственный список фаз и предлагает модели только те инструменты, которые разрешает эта фаза. На агентском пути оркестрирующая модель планирует запуск и сама вызывает инструменты, при этом слои под ней построены, но не всегда консультируются. Общий путь записи делает записанные действия и находки проверяемыми, но доступная оболочка может его обойти. Выдуманная конечная точка даёт захваченный ответ, а не автоматический вердикт об уязвимости. Губернатор серьёзности не может повышать; исторический шлюз повышения отдельного верификатора проверяет цитату, но не устанавливает эксплуатируемость. Авторизация запрашивается на границе инструмента, а не при каждом исходящем запросе. Главы об отчётности различают сканирование, которое ничего не нашло, и сканирование, которому отказали на входе. Эти различия между намерением и принуждением являются частью тематического исследования, а не свойствами для копирования в новый каркас.
Каждая глава после первой заканчивается признанием того, что её контроль всё ещё делает неправильно, а разделы честности несут измерения, которые это показывают. Читайте разделы честности первыми, если вы решаете, стоит ли доверять остальному: корпус — это история эксплуатации одной системы, единственный выбранный публичный целевой запуск — это агрегат, записанный автором, с двумя исключёнными запусками, опубликованными рядом с ним, а абляционное исследование, которое показало бы, насколько детерминированные слои на самом деле способствуют, не проводилось. Репозиторий не содержит необработанных находок выбранного запуска, эталонных данных или матчера, поэтому записанная точность здесь независимо не воспроизводима. Аргумент о дизайне аргументирован, а не измерен, и глава 05 говорит об этом именно этими словами.
Каноничны в главе 00, скопированы здесь. Каждый — это проектное намерение, и глава, названная в конце закона, — это то, где данная система проверяется на соответствие ему: какие части держатся по построению, какие держатся только на одном из двух путей оркестрации, какие держатся на хорошем поведении оркестратора, а какие пока не держатся.
Модель предлагает; детерминированный код распоряжается. Дайте модели интерфейс предложений, а не прямой доступ к цели, необработанному хранилищу или последнее слово по серьёзности. Детерминированный код проверяет, выполняет и записывает допущенную работу. Историческая система не обеспечивает эту границу везде: оба оркестратора могут достичь оболочки, а её путь записи несёт подкоманду, которая сохраняет находку без выполнения. Выдуманная конечная точка может вернуть 404, страницу входа или оболочку приложения; запишите ответ и судите об утверждении отдельно. Общий писатель — это не песочница. Главы 01 и 02.
Утверждения о прошлом должны цитировать. Предложения о будущем должны выполняться. Это разные виды утверждений, и им нужны разные шлюзы. Утверждение о чём-то уже наблюдавшемся должно ссылаться на собственный захват; совпадающая цитата устанавливает целостность цитирования, а не то, что вывод истинен. Исторический шлюз протекает: он сохраняет по элементу за партию, даже если ни один не проходит, а на одном пути оркестрации переданная вызывающим уверенность может заменить проверку. Предложенный тест нельзя проверить, цитируя наблюдение, которое он не делал. Он может выполняться только после того, как авторизация, область, шлюз и проверки бюджета это разрешат, и его результат всё равно требует интерпретации. Закон — это не разрешение выполнять каждое предложение. Глава 02.
Серьёзность падает по умолчанию и повышается только против доказательства. Детерминированный губернатор может понизить серьёзность или пометить находку как ложноположительную и не может повысить её. Это ограничивает его полномочия; это не делает его выводы правильными. Занижение отчётности может скрыть реальную уязвимость, поэтому каждое правило понижения нуждается в тестах на соответствие и контрпримеры и в проверяемой причине. Историческая конечная точка повышения проверяет дословную цитату, но не обеспечивает авторскую оценку, которую запрашивает её контракт. Цитата сама по себе — не доказательство эксплуатируемости. Привяжите захват к находке, примените проверенную политику доказательства домена и сохраните отдельный процесс проверки и подписания человеком. Глава 03.
Область — это функция, а не приговор. Авторизация, вписанная в подсказку, конкурирует с каждой другой инструкцией в окне контекста. Закодируйте разрешение оператора как проверяемую политику и обеспечивайте её перед каждым исходящим действием, с записью отказов. Историческая защита не дотягивает: её запрашивают на границе инструмента, а не при каждом запросе, она расширяет некоторые границы хоста и открывается при аварийном выключателе или при построении без цели. Лаборатория отклоняет не перечисленные источники до своего доверенного обратного вызова, но транспортная изоляция всё равно принадлежит адаптеру. Решение политики настолько же корректно, насколько корректны авторизация и назначение, которые оно оценивает. Глава 04.
Сообщайте о том, чего вы не сделали. Сканирование, которое ничего не нашло, и сканирование, которое не смогло ничего достичь, — это разные сканирования, и отчёт, который отображает их одинаково, лжёт умолчанием. Покрытие, статус шлюза и реестр каждого пропущенного хоста с его причиной принадлежат результату, рядом с находками. Это требование, которое исторический отчёт не выполнил: прибыло только покрытие, вычисленное против его самого слабого знаменателя и под ярлыком, называющим другой. Лаборатория учитывает запланированные действия инструмента и URL, выполненную работу, ошибки и пропуски; этот знаменатель не измеряет покрытие уязвимостей. Глава 05.
| Глава | Тема |
|---|---|
| Глава 00: Градиент детерминизма (исходник) | Почему вариативность — это проблема дизайна, а не проблема возможностей, четыре слоя и пять законов |
| Глава 01: Фиксированная процедура (исходник) | Машина стадий, детерминированная оценка инструментов, априоры как счётчики в файле и соотношение ходов, которое не говорит того, что вы хотели бы |
| Глава 02: Узкое место (исходник) | Один писатель на побочный эффект, проверка схемы и цикл исправления, и почему утверждениям и предложениям нужны разные шлюзы |
| Глава 03: Асимметричное доверие (исходник) | Губернатор, который не может эскалировать, верификатор, который может повышать только против доказательства, и цепочки атак, которые нельзя доказать |
| Глава 04: Область как код (исходник) | Авторизация как функция, реестр пропусков, нижняя граница, которую не должна решать ни одна функция, и пробел в области, записанный в выбранном запуске |
| Глава 05: Чего сканирование не смогло достичь (исходник) | Достижимость как записанное значение, знаменатели покрытия, консолидация, честные частичные результаты и как оценивать собственную систему |
Исторический код в core/ здесь для того, чтобы его читали, запускали и оспаривали. Он чистый и намеренно нефункционален как живой тестер: профилирование, оценка релевантности, планирование и проверка вызовов инструментов реальны и запускаемы, а всё, что отправило бы пакет в сеть, изъято. Запустите ls core/*.py, чтобы увидеть, что поставляется, а не доверяйте цифре, написанной здесь, — это тот вид утверждения, которое устаревает в момент добавления модуля. Контроль, на который опираются более поздние главы, среди них: путь записи — core/store_protocol.py, губернатор серьёзности — core/severity_governor.py, защита области — core/scope_guard.py, проверка шлюза — core/gate_check.py, а машина стадий — walkthrough/run.py. Исторический верификатор вызовов модели изъят. Глава 06 его специфицирует; глава 07 поставляет отдельный детерминированный страж доказательств, а не тот верификатор и не рабочий процесс принятия человеком. Держите их задачи раздельно: критик обоснованности проверяет containment цитат, губернатор ограничивает серьёзность, а путь повышения должен удовлетворять независимо проверенной политике доказательства. Ни один из них не заменяет проверку и подписание человеком.
walkthrough/ управляет этой машиной стадий над зафиксированными фикстурами и записывает артефакты, на которые ссылаются главы, в walkthrough/artifacts/. Перегенерируйте их с помощью python3 -m walkthrough.run, который принимает каталог --out, если вы предпочитаете не трогать зафиксированные копии, а tests/test_walkthrough_is_in_sync.py сравнивает свежий запуск в памяти с этими копиями побайтово, так что фикстура, отредактированная без повторного запуска, краснеет вместо того, чтобы отправиться. Что этот шлюз не ловит — это артефакт, который неправилен в обоих местах, и его собственный docstring говорит об этом.
Каждая цифра в каждой главе сводится к ключу в data/stats.json или несёт аннотацию, называющую, что это за цифра и почему это не измерение, взятое с цели. В главах с 00 по 05 и в этом README тринадцать аннотаций называют константу или свойство кода, тридцать пять покрывают прописанную величину, которую проверка цифр не может прочитать, пять называют код состояния HTTP, и одна называет сравнение между двумя собственными опубликованными снимками этого репозитория. Файл статистики — это замороженный снимок с опубликованным окном, а не живой запрос, и глава 05 объясняет, почему повторный запуск конвейера не воспроизвёл бы его.
Глава 05 сообщает F1 системы против публичного намеренно уязвимого приложения и помещает его рядом с оценкой пассивного сканирования OWASP ZAP. Этот репозиторий доказывает арифметику и держит четыре файла агрегированных оценок синхронизированными с data/stats.json; он не содержит необработанных находок, записей эталонных данных, матчера, идентификаторов целей или идентификаторов запусков, необходимых для доказательства того, что два инструмента оценивались в контролируемом очном сравнении. Относитесь к паре как к историческим, записанным автором точкам данных, а не к честному бенчмарку. Размер выборки, разброс, который он поэтому не сообщает, и запуски, исключённые из него с причиной исключения каждого, — всё это в той главе.
Сгенерированная копия глав, с каждой цифрой, разрешённой до её значения на месте, и каждой ссылкой на код, превращённой в ссылку на core/, живёт в отрендеренном дереве для чтения на GitHub; она создаётся scripts/render.py и поддерживается в синхронизации с исходником tests/test_rendered_is_in_sync.py.
Если вы публикуете репозиторий, следуйте PUBLICATION.md. Публикуйте снимок без истории в новый публичный репозиторий; не меняйте видимость репозитория разработки и не предполагайте, что чистое рабочее дерево очистило его достижимую Git-историю. Обязательный pre-commit scripts/publication_gate.sh отказывает в публикации, если частный денylist не был фактически объединён, публичная Git-идентичность автора не соответствует утверждённому значению, а промежуточный репозиторий имеет предыдущие ссылки, объекты или reflog.
scripts/audit.sh прочёсывает репозиторий на идентификаторы, scripts/prose_check.sh и scripts/verify_claims.sh прочёсывают прозу, tests/test_gates.sh подсаживает нарушения против них, чтобы доказать, что они всё ещё срабатывают, а набор тестов удерживает эталонную реализацию против того, что главы о ней говорят. Глава не закончена, пока каждый из этих шагов не пройден:
python3 -m pip install -r requirements.txt
# pytest, и ничего больше: каждый модуль в
# core/ — только стандартная библиотека
export HANDBOOK_ROOT=.
bash scripts/audit.sh . # всегда опубликованные паттерны; денylist работодателя,
# клиента и хоста только там, где он существует, и этот
# файл частный, поэтому ни один клон его не несёт. Какая
# половина запустилась — в строке "sanitization scope:",
# которую это печатает, а не в коде выхода, поэтому
# читайте строку
./scripts/prose_check.sh handbook # механические AI-признаки
./scripts/verify_claims.sh handbook # цитаты, непроцитированные цифры, перекрёстные ссылки,
# якоря утверждений, атрибуция источников
./scripts/prose_check.sh README.md # оба шлюза принимают цель и по умолчанию используют handbook/,
./scripts/verify_claims.sh README.md # поэтому этот файл нужно назвать, чтобы его проверили
./tests/test_gates.sh # шлюзы против подсаженных нарушений, дерева,
# README и утверждений глав; собственная проза глав
# покрыта шлюзами прозы и утверждений, нацеленными на
# handbook выше, а не этим прочёсыванием
python3 -m pytest tests/ # весь набор, и он печатает собственный счёт,
# а не имеет его вписанным здесь. Каждая строка
# выше запускает скрипты шлюзов и файлы pytest,
# которые они подключают, — те, что об этом документе;
# тесты контроля, о котором говорят пять законов —
# губернатора серьёзности, защиту области, проверку
# шлюза, общий путь записи, критика обоснованности —
# достигаются этой строкой и ничем выше. Поломка
# в одном из них краснит строки выше только там, где
# она также двигает зафиксированные артефакты walkthrough
tests/test_chapter_claims.py, внутри этого набора, — тот, который стоит украсть. Он содержит утверждения против эталонной реализации и опубликованной статистики, и каждое привязано к дословному предложению, которое оно подкрепляет, так что правка, меняющая факт, проваливает тест вместо тихой отправки.
Теодорос Мутесидис.
| Глава 06: Соберите свою (исходник) | Упорядоченное руководство: каждый шаг называет инвариант, который он защищает, и указывает файл, обеспечивающий его, тест и зафиксированный артефакт везде, где публичное дерево их несёт |
| Глава 07: Лаборатория каркаса (исходник) | Рекомендуемый офлайн-эталон: обеспечьте границу, изучите полный отчёт и протестируйте то, что должно быть отклонено |
| Приложение A: Контракт оркестратора (исходник) | Инструмент, который вручают модели, обобщённый из частного оригинала |
| Приложение B: Схемы (исходник) | Формы вызовов инструментов, находок и записей управления, с тем, что каждая гарантирует и чего не гарантирует |
| Приложение C: Музей отказов (исходник) | Реальные ложные срабатывания с их первопричиной и правилом, которое каждое убивает, и какие из них этот репозиторий может закрепить |