ホーム 総務省「全国型CTF」— AI Agentパイプライン運用の振り返り
記事
キャンセル

総務省「全国型CTF」— AI Agentパイプライン運用の振り返り

総務省の全国型CTFに個人で参加した。確認済みの大会規則ではAI利用が認められていた。公式CTFdプロフィールには26位、5,701点と記録されている。この公式結果とローカルtrackerの集計は別の記録だ。

最終CTFdプロフィールのcrop。26位・5,701点。個別challengeの提出履歴は除外。
最終CTFd結果は26位・5,701点。公開cropには個別challengeの提出一覧を含めていない。

公式CTFd結果: 26位 · 5,701点

参加形態 / 規則: 個人参加 · AI利用可

ローカルtracker: 記録対象110件 · 提出結果の記録107件 · ローカル判定correct 101件 · incorrect 6件

Event)

全国型CTFは、限られた時間内に多くの課題を集め、解き、検証し、提出する運用面の課題でもあった。この記事は各challengeの解答紹介ではなく、pipeline運用の振り返りだ。公式結果、ローカルtrackerの集計、event traceで確認できた事実、記録からは分からないことを分けて書く。

Result)

保存されたtrackerには110件のchallengeがあり、提出結果が記録された行は107件だ。そのうち101件がcorrect、6件がincorrectで、残る3行には結果が記録されていない。結果行の数は自動で解けた問題数を意味しない。

trackerでcorrectと記録された101件について、accepted pointを合計すると5,900点になる。これは公式scoreではない。CTFdプロフィールの5,701点との差は199点だが、保存されたevidenceから原因は特定できない。両者は別の値として扱う。

110件のtrackerをcategory別に集計した図。107件の結果記録、101件のcorrect、6件のincorrect、結果未記録3件と各categoryの状態を示す。
保存されたtrackerの集計であり、公式scoreではない。提出結果の記録率は自動化率を意味しない。

Approach)

ローカル記録には110件のchallenge recordと、20個のchallenge IDにまたがる21個のattachmentが残っている。セッションログにはlocal advisor/modelとremote APIの両方が現れる。並列作業の指示や、別のsubmission workerも記録されている。

保存されているchallenge recordと一部のeventから、完全なend-to-end実装までは確認できない。challengeごとのworker/model割り当て、人の介入時点、retry回数は結果記録と結び付いていない。

author提供のevent captureには、大会途中のCTFdプロフィール(29位・4,401点)が記録されている。同じcaptureのOMP画面と個別challenge履歴は、challengeごとの運用内容が映るため掲載しない。約13:53 JSTのさらに早いcaptureには302位・1点が写っていたが、図1の最終結果ではなく大会序盤の状態だ。

大会途中のCTFdプロフィールcrop。29位・4,401点。OMP画面とchallenge履歴は除外。
大会途中のCTFd状態。29位・4,401点で、最終結果ではない。

下の補足timelineは保存されたcontrol-plane eventと介入記録から再構成した。時系列を補う派生資料であり、OMP画面や実際のsolve時間を示すものではない。

保存されたUTC event記録から再構成した補足timeline。重なったtask lifetimeはactive solve timeではない。
補足・派生timeline。保存されたcontrol-plane eventと介入記録の時間順序を示す。重なったtask lifetimeはactive solve timeではない。

Problem)

trackerだけではpipeline全体の状態は分からない。owner欄は空で、challengeごとの開始・終了時刻も十分に残っていない。HTTPリクエストの成功と、CTF側が正解と判定したことは別だ。

challengeを一つ解くことと、システム全体の正確な状態を把握することは別だ。たとえばqueue stateがworker間で複製され、提出結果の反映が遅れれば、重複作業や受付終了後の作業が起こり得る。保存されたevidenceだけでは、個々の運用事象の原因までは復元できない。

Bottleneck)

保存された記録から見える主な課題は、model inferenceよりもcontrol plane側にある。

  • Ownershipとstate: challengeごとのowner/leaseがなく、重複作業や責任範囲を測れない。
  • Artifact intake: tracker上のmanifestと取得済みファイルが一致するとは限らない。hashとprovenanceが必要だ。
  • Verification: 提出前に結果の形式と意味を独立して確認する。
  • Observability: challenge ID単位のevent記録がなければ、model性能とcontrol-plane遅延を分けて評価できない。
  • Close control: 権威ある締切と公式result exportがなければ、遅い作業を安全に止め、trackerを照合しにくい。

Local vs API)

challengeごとのroute記録がないため、local computeでAPI利用がどれだけ減ったか、人が何件介入したかは算出できない。正確な自動化率や削減額も示せない。

Architecture v2)

次回はchallenge IDをキーに単一のcanonical queueとactive leaseを設ける。intake時にファイル形式とhashを確認し、まずローカルでdeterministicな解析を行う。必要な場合だけ、health check済みのlocal modelまたは予算を明示したremote APIに回す。候補はprivate evidence storeに保管し、independent verifierを通った結果だけをsingle submission brokerで一度提出する。公式cutoffでbrokerを閉じてからscoreを照合する。

この図は2026年の実装を示すものではない。左は保存されたevent evidenceから再構成したV1で、実装全体を検証した仕様ではない。右は提案するV2であり、実装完了前後の比較ではない。

左はevent evidenceから再構成したV1のartifactと未確認の接続、右は提案するV2 control-plane architecture。
記録から再構成したV1(左)と、提案するV2(右)。

Retrospective)

次回はworkerを増やす前に、challengeごとの実行記録と提出状態を残す。

Evidence / Notes)

  • 最終順位・得点はFigure 1の公式CTFdプロフィールで確認できる。
  • local trackerはchallenge 110件、提出結果107件(correct 101件、incorrect 6件、未記録3件)、合計5,900点だ。CTFdの5,701点とは別で、199点差の原因は未確認だ。
  • Figure 4はauthor提供captureからCTFdプロフィールだけを残したcrop(29位・4,401点)だ。OMP画面と個別challenge履歴は掲載していない。約13:53 JSTの302位・1点はさらに早い状態で、最終結果ではない。
  • 補足timelineは保存されたeventから再構成した派生資料だ。Figure 5のV1も保存されたevidenceからの再構成で、V2は提案である。
  • challengeごとのmodel routeと人の介入記録は不完全だ。正確な自動化率は算出できない。
この記事は著者により CC BY 4.0 ライセンスで公開されています。

コーヒーで応援する