Devotd Github
新着AIエージェント

footprintai/containarium #3455 — サーバーログのテナント値の %q クォート処理

containarium はサーバーログでテナント提供の文字列を %q でクォートするようになり、ログ偽造と端末制御文字注入の経路を塞いだ。

リポジトリ情報footprintai/containarium ↗

containarium はサーバーログでテナント提供の文字列を %q でクォートするようになり、ログ偽造と端末制御文字注入の経路を塞いだ。

GitHub の説明: Open-source agent runtime — SSH-native isolation, eBPF egress policy, Kubernetes + LXC backends, GPU passthrough, MCP-native CLI

スター
★ 304
フォーク
52
言語
Go
ライセンス
Apache-2.0
最新リリース
v0.106.0
原文を見る ↗GitHub で見る ↗

footprintai/containarium は、ネイティブ SSH 隔离、eBPF egress ポリシー、Kubernetes と LXC バックエンド、GPU パススルー、ネイティブ MCP CLI を備えたオープンソースのエージェントランタイムである。2026-11-03 のコミット 4be7f81(#3455, #3468) は、このランタイムの internal/server ログでテナント提供の文字列を %s ではなく %q でクォートするようになった。

背景はログ偽造と端末制御である。ユーザー名やコンテナ名のようにテナントが決められる値に改行文字が含まれていれば、ログの一行を偽造でき、ESC 文字はオペレーターの端末にそのまま到達し得た。今回の変更はユーザー名、box・コンテナ名、tracker 接続・プロジェクト名、ボリュームとシークレットキー名、プロセス名、run id と token id を対象とし、internal/server の log.Printf 346 箇所と run-checkout sweep の注入ロガー 4 個をまとめて直した。設定パス、IP、継続時間、peer id、enum の状態、サーバーが生成した id のようなオペレーター・デーモン側の値はそのまま残した。

検証も同時に追加された。503 行の log_quote_test.go は値の種類ごとにハンドラを 1 つずつ用意し、改行と \x1b を注入して、ログに制御バイトや偽造された行が残らないことを確認し、さらにパッケージの AST を走査して、テナント値の式が %s や %v に 묶まれた log.Printf が再び現れたら失敗させる。レビュー後の後続コミットはこの検査を log.Print・Println・Fatal・Panic と注入された printf ロガーまで広げ、トークンローテーション行の jti と family id、checkout sweep 名をクォートした。ユーザー削除失敗ログで名前を 'sudo userdel -r' のヒントに付けないようにしたのも同系統の整理である。Go の %q はシェルのクォートではないからだ。

限界は確かに残っている。changelog fragment が明言しているように、ログ行の後ろに付くエラーメッセージはまだ %v でクォートされておらず、エラーに混じった値は依然として行を壊す可能性があり、これは別途追跡中である。既存のログフィルタが user=alice のような旧形式を前提としているなら更新が必要だ。値は 이제 user="alice" の形に、sweep 行は [run-checkout-sweep] "<name>-container": の形に、box で捕捉した stderr は stderr="line one\nline two" のように 1 行に収まる。これはテナント値でログを汚染させる経路を塞ぐ防御的な修正であり検証も付随しているが、エラーパスに残った分とフィルタの移行はオペレーターが負う部分である。