
학습된 사이버 방어 벤치마크를 감사하기 위한 재현 하네스, 패치 및 분석 도구: 에이전트 트레이스를 캡처하고, 레드 에이전트 제거 실험을 실행하며, 공개된 데이터로부터 모든 논문 그림을 재계산합니다.
이 저장소는 논문 What a CAGE 4 Score Measures: An Audit of a Learned Cyber-Defense Benchmark, Its Reference Defenders, and the Tables Built on Them(James M. Rice 및 지도교수, Rochester Institute of Technology, 2026)의 배후에 있는 하네스, 패치, 분석 도구 및 원장입니다. arXiv 식별자는 게시 후 첫 커밋에서 여기에 추가됩니다. 태그 arxiv-v1은 게시된 논문의 모든 수치가 계산된 상태입니다.
논문의 수치가 계산된 트레이스와 체크포인트는 https://doi.org/10.5281/zenodo.23681828 에 네 개의 아카이브로 별도 보관되어 있습니다.
| 아카이브 | 내용 | 압축 해제 위치 | sha256 |
|---|---|---|---|
traces_arms_arxiv-v1.tar.zst | 주요 감사의 모든 평가 arm에 대한 단계 기록으로, 논문 부록 B에 나열된 123개와 ARMS.md에 명시된 진단 arm을 포함하며, arm당 하나의 디렉터리, 에피소드당 하나의 JSON-lines 파일 | data/traces/ | db2c3d17684180e5d4ca7fb9a7f1f739b5414e62da0e8c4b9b792cd31568f456 |
traces_pilot_arxiv-v1.tar.zst | busy-check 파일럿 및 그 연속 실행(arm 이름 kbf_*)의 단계 기록 | data/traces/ | ece72ca24d17bf688144b2d0276ae9f0209aa8a50f95ecdd0aab9a6f8a9c0fc0 |
checkpoints_pilot_arxiv-v1.tar.zst | 파일럿 및 연속 학습 실행의 보관된 체크포인트와 재개 상태 | repos/cage-4-submission/checkpoints/ | dc2c8219e12a0c2931263be0003c8858039931b04b019e1bfa60c0ba6856c07e |
checkpoints_continuation_arxiv-v1.tar.zst | 5장의 Wrecker 연속 실행 체크포인트 | repos/cage-4-submission/checkpoints/ | SHA256SUMS에 있음 |
run_logs_arxiv-v1.tar.zst | 두 머신에서의 파일럿 및 연속 실행의 학습 및 평가 로그로, 각 실행의 호스트, 스레드 수, 워커 수, 코드 다이제스트 및 이미지를 기록한 pilot_runs.log 포함 | data/ | SHA256SUMS에 있음 |
보관소의 SHA256SUMS에 네 개 모두 나열되어 있습니다. 압축을 풀기 전에 sha256sum -c SHA256SUMS로 아카이브를 확인하십시오.
| 경로 | 설명 |
|---|---|
bin/run | 이 디렉터리가 /work에 마운트된 상태로 두 이미지 중 하나에서 명령을 실행하며, KEEP_* 및 HMARL_* 스위치를 전달합니다. 클론이 ~/cage에 있을 것으로 예상합니다. |
build/ | 두 개의 Dockerfile(Dockerfile.keep, Dockerfile.marl)과 이미지가 빌드되기 전에 업스트림 저장소에 적용되는 패치 |
scripts/capture.py | 쌍을 이룬 환경 시드에서 KEEP의 릴리스된 정책을 실행하고, 에이전트의 원시 관측값과 시뮬레이터의 실제 상태를 담은 스텝 기록을 작성합니다 |
scripts/capture_hmarl.py | H-MARL Expert에 대해 동일한 작업을 수행하며, 저자들의 평가 경로(--compat) 또는 감독 하네스를 통해 실행합니다 |
scripts/oracle.py, scripts/oracle_rules.py | KEEP에 대한 감독 하네스, 규칙 O1~O15 및 규칙 방어자, 그리고 전달 스위치(--wait-busy, --queue, --min-gap) |
red_agents/ | 논문이 기본 FiniteStateRedAgent 외에 실행하는 적대자들. Wrecker와 그 Pn 및 Qn 사다리는 논문 자체의 것(2절)이며, bin/run은 실행 시 이곳의 모든 파일을 이미지의 SimpleAgents 디렉터리로 복사합니다 |
tools_*.py | 분석 도구들. tools_paired.py(쌍별 차이, 부트스트랩 구간, 승수, 부호 검정), tools_charge.py 및 tools_busy_charge.py(Restore charge 및 나머지), tools_dropped.py(주장된 개입에 대해 실행), tools_cont.py, tools_ceiling.py, tools_fraction_ci.py, tools_latch_sum.py, tools_drawspread.py, tools_lagcorr.py, tools_busy_restores.py, tools_pilot_decisions.py 및 나머지. 각 도구는 data/traces/ 아래의 트레이스 디렉터리에서 계산한 내용을 출력합니다 |
tools_patch_*.py | 릴리스된 코드에 대한 패치 스택. tools_patch_keep_busy.py, tools_patch_keep_seedmode.py, tools_patch_keep_readall.py를 이 순서대로 적용하면 KEEP의 트레이너에 6절의 스위치가 제공됩니다. tools_patch_hmarl_busy.py는 H-MARL의 래퍼에 HMARL_BUSY=none 스위치를 제공합니다. tools_patch_oracle_truth.py는 하네스에 --log-truth를 추가합니다. 각 패치는 멱등적이며 인식하지 못하는 코드에서는 실행을 거부합니다 |
run_keep_pilot.sh, eval_keep_pilot.sh, pilot_status.sh, test_keep_*.sh | 6절의 파일럿과 연속 실행, 그 평가 및 테스트 |
run_busy_reds.sh | 기본 적대자 및 아홉 개의 다른 적대자에 대해 busy 검사를 켜고 끈 상태의 릴리스된 KEEP 정책(6.1절) |
queue_*.sh, read_*.sh, run_*.sh, rerun_F.sh, gate_O15.sh, pilot_O15.sh, svy_O15.sh | 캠페인 런처와 리더. 논문의 모든 arm은 이들 중 하나에 의해 실행되었으므로, 이들은 각 arm의 정확한 호출 기록입니다 |
ARMS.md | 모든 arm을 이름별로, 그 명령, 평균 및 이를 담고 있는 파일과 함께 정리한 문서 |
RESULTS.md | 작업의 날짜별 로그, 최신순 |
papers/ | 논문의 텍스트 없이 논문 분석 계층을 담은 아티팩트 사본. papers/paper1/ledger.csv는 원장으로, 논문에 인쇄된 각 숫자당 한 행이며 이를 재계산하는 명령이 포함되어 있습니다. papers/paper1/fig/에는 그림 및 표 스크립트가 있습니다. papers/paper1/check_identities.py는 모든 빌드가 충족해야 하는 산술 항등식을 검사합니다. papers/에 있는 recompute_*.py 및 means.py 스크립트는 원장이 호출하는 기준, 분산 및 비율 계산입니다 |
data/ 및 repos/ 아래의 모든 것은 git에서 무시됩니다. 트레이스는 data/traces/ 아래에, 업스트림 저장소와 체크포인트는 repos/ 아래에 위치합니다.
논문의 부록 A는 세 가지 수준을 명시합니다. 이들은 점점 더 많은 환경을 필요로 합니다.
클론하고, 두 트레이스 아카이브를 data/traces/에 풀고, 저장소 루트에서 재계산을 실행하십시오. 이 디렉터리에서 원장의 모든 고유 명령을 실행하고 각 행의 저장된 값이 해당 명령의 출력에 나타나는지 확인합니다.
git clone https://github.com/jrice-ai/cage ~/cage && cd ~/cage && git checkout arxiv-v1
mkdir -p data/traces && tar -I zstd -xf traces_arms_arxiv-v1.tar.zst -C data/traces && tar -I zstd -xf traces_pilot_arxiv-v1.tar.zst -C data/traces
./recompute.sh
python3 papers/paper1/check_identities.py papers/paper1/ledger.csv
원장의 명령은 저자 머신에서의 경로인 ~/papers로 분석 계층을 지칭하므로, recompute.sh는 HOME을 papers/를 그곳에 링크하는 스크래치 디렉터리로 지정하여 검사를 실행한다. 저장소 외부에는 아무것도 기록되지 않는다. 노트북에서 전체 재계산은 수십 분이 걸리며, 대부분은 파일럿 arm에 소요된다. 열 개의 행, 즉 공개된 체크포인트에서 읽은 하이퍼파라미터(키 keep*와 trident*, 이들은 bin/run을 통해 실행됨)는 레벨 2 이미지를 필요로 하며, 없으면 찾을 수 없음으로 보고된다. check_identities.py는 산술 항등식(모든 분할에 대해 비용은 청구액 더하기 나머지, 네 번의 추출 및 네 개의 시드 구간 대 그 평균과 표준편차, H-MARL 마스크 해제 쌍의 나머지 0)을 보고한다. papers/paper1/fig/ 아래의 그림 및 표 스크립트는 동일한 트레이스로부터 논문의 그림과 표를 CAGE=~/cage python3 papers/paper1/fig/fig_curves.py로 재생성하며, fig_drop.py, fig_noise.py, make_tables.py, make_busyreds.py, make_arms.py도 마찬가지이다.
이를 위해서는 두 이미지, 고정된 리비전의 업스트림 저장소, 그리고 공개된 체크포인트가 필요하다.
세 개의 업스트림 저장소를 논문이 계산된 리비전, 즉 논문의 표 12에 인쇄된 리비전으로 repos/에 클론한다.
| 저장소 | 리비전 |
|---|---|
cage-challenge/cage-challenge-4 | 8c3c50ca54b1 |
cybermonic/cage-4-submission (KEEP, weights/ 아래에 공개된 다섯 개의 체크포인트 포함) | 2afd652d80ce |
adityavs14/Hierarchical-MARL (H-MARL Expert, 공개된 체크포인트 포함) | 6fe960f5931f |
build/의 패치를 그것이 지칭하는 저장소에 적용한 후(각 클론 내부에서 git apply), 저장소 루트에서 두 이미지를 빌드한다. 두 방어자의 의존성 집합은 공존할 수 없으며, 이것이 두 개가 존재하는 이유이다.
docker build -f build/Dockerfile.keep -t cage-keep:dev .
docker build -f build/Dockerfile.marl -t cage-hmarl:dev .
논문이 보고하는 체크포인트 다이제스트는 정렬된 파일별 md5들에 대한 md5로, KEEP의 다섯 파일에 대해서는 55fb3e7f46540eeea63230b149e1744e이고 H-MARL의 열다섯 정책 파일과 algorithm_state.pkl에 대해서는 fd9e9172fd56b723fedca72ce0e78a16입니다. 무엇이든 실행하기 전에 이를 확인하십시오.
그다음 하나의 arm은 bin/run을 통한 하나의 명령입니다. 기본 adversary에서 백 개의 짝지어진 환경 시드에 대해 공개된 KEEP 정책을, 실제 상태가 기록된 상태로 실행하는 것이며, 이것이 corpus_v1 arm입니다,
bin/run cage-keep:dev python3 /work/scripts/capture.py --episodes 100 --base-seed 0 --red FiniteStateRedAgent --out /work/data/traces/corpus_v1 --workers 4
H-MARL Expert는 저자들의 평가 경로를 통해, 이는 재현 구간의 arm이며,
bin/run cage-hmarl:dev python3 /work/scripts/capture_hmarl.py --rule none --episodes 100 --base-seed 0 --compat --out /work/data/traces/hmarl_s0
and 감독 팔, O1은 KEEP에서 32단계의 간격으로 에이전트가 유휴 상태가 될 때까지 유지되었으며,
bin/run cage-keep:dev python3 /work/scripts/oracle.py --rule O1 --min-gap 32 --wait-busy --episodes 100 --out /work/data/traces/so_O1_g32_wb
논문에 나오는 모든 arm의 정확한 호출 방식은 queue_*.sh 및 run_*.sh 스크립트에 있으며 ARMS.md에 기록되어 있고, 동일한 시드로 다시 실행하면 공개된 arm이 한 자리까지 재현되는데, 이는 6.1절의 H-MARL arm이 이미지 사본으로부터 두 번째 머신에서 캡처되어 그 대조군을 재현하는 것과 같습니다. 6.1절의 busy-check 소거 실험은 KEEP의 경우 run_busy_reds.sh이며, H-MARL의 경우 tools_patch_hmarl_busy.py에 이어 HMARL_BUSY=none 및 --log-policy를 사용한 capture_hmarl.py입니다.
이 작업에는 패치된 트레이너와 시드당 며칠의 CPU가 필요합니다. 세 가지 KEEP 트레이너 패치를 순서대로 적용하고 그 테스트를 실행하십시오. 각 테스트는 몇 분씩 걸리며 모든 스위치를 검증합니다,
python3 tools_patch_keep_busy.py && python3 tools_patch_keep_seedmode.py && python3 tools_patch_keep_readall.py
./test_keep_busy.sh && ./test_keep_seedmode.sh && ./test_keep_readall.sh
그런 다음 파일럿 arm을 실행합니다. F는 기본 제공되는 busy 검사와 함께 학습하고, N은 그것 없이 학습하며, S는 고정 레이아웃 시드 대조군이고 R은 전체 읽기 대조군입니다. 업데이트는 5개 에피소드(R의 경우 25개)이며, 보존된 체크포인트는 repos/cage-4-submission/checkpoints/ 아래에 100회 업데이트마다 저장되며, resume 인자는 상태 파일에서 실행을 이어갑니다.
nohup ./run_keep_pilot.sh F 4101 400 0-17 > /dev/null 2>&1 &
./pilot_status.sh
./eval_keep_pilot.sh kbf_F_s4101 400 shipped 6