Linuxセキュリティ研究の方法
これは自分たちのループバック上のノードへの制御された試験です。以下の再現コマンドはローカルの完全な開発リポジトリを前提とし、公開ZIPは原記録・計画・ログ・画面だけを含みます。完全なソース公開と配布ライセンスは未確定です。
実験計画
状態:ローカル実験計画。外部の事前登録ではない。2026年10月31日。
対象は現在のAINET 0.1と、この研究で検証する修正である。既存研究001の測定・実行ファイルは保持する。実験対象は127.0.0.1上の自分たちの試験ノードと合成データに限る。
問いと信頼境界
未登録の相手、登録済みだが不正な提供元、登録済みだが通信を引き延ばす要求元を区別する。OSユーザー・管理者・実験ハーネスは信頼する。外部インターネット、NAT、複数ホスト、AIモデル、実データの攻撃耐性は測らない。署名が有効でも情報の真偽や受信文章の安全性を保証しない。
実施項目
| ID | 内容 | 主に確認すること |
|---|---|---|
| S1 | 未登録相手、ID/鍵の不一致、送信元の偽装 | 認証境界を越えずに拒否するか |
| S2 | 不正な署名・本文・応答対応・Object ID・サイズ、不完全転送 | 不正資料を正式保存せず、正常通信へ復帰するか |
| S3 | 登録済み1ノードによる複数の遅いストリーム | 別の正常ノードからの取得が期限内に完了するか |
| S4 | 受信本文の停止中に、別の資料を提供・参照 | ネットワーク待機が保存処理全体を止めるか |
| S5 | MESSAGEの受領通知消失と同じIDの再送・競合 | 二重保存せず、同じIDの異なる内容を拒否するか |
| S6 | 呼び出し元の期限・キャンセル | ストリームの読み書きを中断し、枠を解放するか |
| S7 | 秘密鍵の権限、ログ、受信した指示文、CBOR変異入力 | 秘密を出力せず、本文を実行せず、不正入力で停止しないか |
S1〜S5は可能な限り独立プロセスのノードとプローブで測る。S6はGo APIの実接続試験として分け、プロセス分離の試験と同一視しない。S7のfuzzは時間を制限し、実行回数と対象を記録する。既存の単体・統合・race検査も修正後に実施する。
測定規則
不正転送の各条件は3反復、可用性の各条件は5反復を基本とする。正常通信の期限は2秒とし、これは同一ホスト上の小さな文章に対する試験用の基準であり、本番SLOではない。キャンセル試験の呼び出し期限は250 ms、終了の許容上限は800 msとする。期待した拒否と、正常仕事の失敗を別に数える。過負荷がなくても接続の準備が失敗した場合はハーネス失敗として残す。
修正前に症状を再現し、入力・開始位置を変えずに修正後も測る。ベースラインで問題が成立しない場合は、その結果も記録する。新たな原因を調べるために計画を追加した場合は追記を残す。攻撃の最大効果や一般的な検出率は、この小さな標本から推定しない。
証拠
バイナリ・ソース・計画のハッシュ、環境、コマンドの終了コード、標準出力、要求の結果、保存状態を記録する。秘密鍵と試験ノードの保存領域は一時ディレクトリに置き、成果物に入れない。実行画面は実際のLinuxのコマンド・記録を表示して取得し、説明用の架空の成功画面を作らない。
専用Codex Securityスキャンの補助リソース・登録機能はこの環境で利用できなかった。この研究は手動のソース確認とローカル実通信試験であり、その専用スキャンの完了や外部監査を主張しない。
結果と再現手順
本研究は、自分たちのループバック上の試験ノードに対する不正入力・通信停止の再現と修正である。通常の外部サーバーや第三者を試験対象にしない。対象アドレスを外部へ変更するオプションはない。
| 再現した問題 | 修正 | 確認した結果 |
|---|---|---|
| 1台で全4枠を占有 | 同じ認証済み相手からの受信を2枠に制限 | 別の正常取得:期限内0/5→5/5 |
| 遅い本文受信が保存全体を停止 | 容量予約後、ロック外で受信・検証 | 別の正常取得:期限内0/5→5/5 |
| 通信確立後に呼び出し期限が効かない | contextを通信のresetと期限へ結び付け | 250 ms期限・800 ms許容上限:0/10→10/10 |
プロセス試験全体は修正前70/80、修正後80/80項目成功。これは選んだ反復検査の件数であり、包括的な安全性の保証ではない。説明は日本語報告、English、計画を参照。PDFは
../reports/TB-AINET-SEC-001-en.pdf と
-ja.pdf。
同じ測定バイナリで再試験する
必要なGo/Python環境はプロジェクトREADMEと
research/requirements.txt
を参照。試験ディレクトリは新しい名前を使い、既存記録を上書きしない。
python3 research/security/run_lab.py --binary bin/ainet \
--out research/security/results/my-baseline
python3 research/security/run_lab.py --binary bin/ainet-security-fixed \
--out research/security/results/my-fixed --require-pass
修正前は意図的に失敗を記録するため --require-pass
を付けない。異常な実験器終了は harness-error.json
として残す。正常仕事の2秒期限、3回・5回の反復はこの小さなローカル試験の基準である。手順に時間待ちを含むが、外部の高負荷試験を行うものではない。
ソースから新しいバイナリを作る
go build -o bin/ainet-security-rebuilt ./cmd/ainet
go build -o bin/ainet-security-probe ./research/security/probe
python3 research/security/run_lab.py --binary bin/ainet-security-rebuilt \
--out research/security/results/my-rebuilt --require-pass
go test -race ./...
go test ./internal/node -run TestCallerDeadlineInterruptsStream -count=5 -v
go test ./internal/language -run '^$' -fuzz=FuzzDecode -fuzztime=10s -parallel=2
測定環境ではPATH先頭に /workspace/.ainet-tools/go/bin
を指定し、Go
1.26.10を使った。通常の開発環境では正しいGoをPATHに設定する。再ビルドのバイト列が変わる場合は、新しいハッシュと環境を記録する。過去の数値を新しいビルドの成績として流用しない。
期限の修正前再現には baseline-source/
のコピーを一時ディレクトリに作り、現在の
internal/node/cancellation_test.go
を加えて該当テストを実行する。元のスナップショットを編集しない。失敗を期待する。API試験は1プロセス内の実接続であり、プロセス分離の80項目とは別の集計である。
記録・図・PDF
python3 research/security/summarize.py --show comparison
python3 research/security/build_report.py
evidence-manifest.json
は研究の入力と修正ソースを識別する。PDF作成スクリプトは固定した実験記録を再集計するだけで再実験しない。results/verification/
はrace、vet、fuzz、依存関係、通常CLI回帰の実行ログである。changes.patch
は保存した修正前ソースとの比較。公開ZIPには原記録・計画・ログ・画面を入れ、秘密鍵やノードの保存領域を含めない。
capture_terminal.py
はXvfbとxtermで実際のLinux端末を起動し、保存済み実験の集計を表示して画面を撮影する。画面は元の通信瞬間の撮影ではなく、結果を読む手順の記録である。ツール配置はこの実験環境用で、他環境ではXvfb/xtermのパスを合わせる必要がある。
残る研究
相手別2枠は複数相手の共謀やSybil対策ではない。BUSY、待機キュー、期限付き再試行、CLIからのキャンセル伝播は未完成。物理的な電源断、複数マシン、NAT、AIモデル、独立した第三者の再実装は未評価。署名が有効でも、情報が真実、安全な命令、最新版だとは言えない。
研究001の原記録と bin/ainet
は保存したまま、今回の修正バイナリを分けている。公開ライセンスとフルソースの公開リリースは未決定。外部事前登録、独立査読、専用Codex
Securityスキャンの完了も主張しない。