添付ファイルの取り込み
English: Attachment intake
メールの添付は、マルウェアが会社に届く最も多い経路です。Kurahi は添付ファイルのバイト列をモデルに渡さず、検査が終わるまでプロジェクトに保存しません。チャットでエージェントが求めた場合も、オートパイロット のルーティンが収集した場合も、受信ファイルはすべて同じ手順を通ります。
処理の流れ
「処理の流れ」の見出しm365_mail_attachment_fetch(Microsoft 365 コネクタ、メール読み取りスコープ Mail.Read。Graph の GET /me/messages/{id}/attachments/{id} にはこれ以上の権限は不要)は、1通のメッセージの添付1件について次を行います。
- ダウンロード:20 MB 以下のファイル添付1件。添付された Outlook アイテム(
item_attachment)とクラウドファイルへのリンク(reference_attachment)は拒否し、申告サイズが 20 MB を超えるもの(too_large)もダウンロード前に拒否します。 - 隔離:
<KOLO_HOME>/projects/<id>/quarantine/attachments/に書き込みます(モード 0600、ファイル名も拡張子もなし)。プロジェクトのデータ領域であり、顧客フォルダーではありません。隔離コピーは結果にかかわらず取り込みの終了時に削除します。 - 静的ポリシー(スキャナーの有無にかかわらず常に実施。下記参照)。
- 隔離ファイルのマルウェアスキャン(下記「スキャナー」参照)。通過するのは
cleanだけです。unscannedはsecurity.attachments.requireScanがfalseの場合に限り通過します。 - 保存:プロジェクトフォルダーの
inbox-attachments/に<日付>-<ハッシュ>-<無害化した名前>でコピーします。このフォルダーはプロジェクトの現在のモードで書き込み可能である必要があります(プロジェクトの書き込み可能フォルダーにinbox-attachmentsを追加し、実行 Act モードにする)。シンボリックリンク経由では書き込まず、整合性レジストリが保護するファイルにも、別のファイルの上にも書き込みません。学術情報源が取得したオープンアクセス論文は、同じ規則でcorpus-inbox/に保存します。保存先は 2 つの固定名のいずれかで、ツールの引数が選ぶパスではありません。 - 保存したファイルのテキストを別の子プロセスで抽出します(下記)。
ツールは、プロジェクト相対パス、種類、サイズ、SHA-256、判定、抽出テキスト(信頼できない内容の境界 EXTERNAL_UNTRUSTED_CONTENT の中)を返します。パスを返すのは clean 判定の後だけで、ファイルのバイト列は返しません。
m365_mail_read はメッセージの添付をメタデータだけで1行ずつ列挙します:attachment: <messageId>|<attachmentId> | name: … | size: … | contentType: …。先頭の値が取得ツールに渡す ref です。
静的ポリシー
「静的ポリシー」の見出し判定はバイト列で行います。ファイル名は拒否理由を増やすだけで、ファイル名によって受け入れられることはありません。
| コード | 拒否するもの |
|---|---|
executable |
PE(MZ)、ELF、Mach-O・ユニバーサルバイナリ、Java クラスファイル、ディスクイメージ。実行形式・スクリプトの拡張子(.exe .js .vbs .ps1 .bat .cmd .scr .lnk .hta .jar .msi .iso .img など)。アーカイブ内も対象 |
script |
#! で始まるスクリプト |
office_macro |
Office の zip 内の vbaProject.bin、マクロ有効のコンテンツタイプ、マクロ有効の拡張子(.docm .xlsm .pptm …)、OLE ファイル内の VBA |
encrypted_archive |
暗号化フラグまたは AES 方式の zip エントリ |
encrypted_office |
EncryptedPackage を含む OLE 複合ファイル(パスワード付きの Word・Excel・PowerPoint) |
nested_archive |
ファイル内のアーカイブのさらに内側のアーカイブ(文書に埋め込まれたグラフ用ブックのような1段目は開いて検査し、それより深いものは拒否) |
zip_bomb |
5,000 を超えるエントリ、申告合計 200 MB 超、1 MB を超えるエントリで圧縮率 200 超、申告サイズを超えて展開されるエントリ |
archive_unreadable |
壊れた zip ディレクトリ、ZIP64、未知の圧縮方式 |
unsupported_type |
文書の許可リスト(PDF、DOCX、XLSX、PPTX、CSV、TXT、MD、PNG、JPEG、GIF、WebP)以外。単体の zip や旧形式の Office ファイルを含む |
type_mismatch |
拡張子と内容が一致しないもの |
スキャナー
「スキャナー」の見出しkolo.json の security.attachments.scanner:
| 値 | エンジン |
|---|---|
auto |
既定。ClamAV があれば ClamAV、なければ到達可能な Microsoft Defender、どちらもなければ none |
clamav |
デーモンのクライアントがあれば clamdscan --fdpass、なければ clamscan --no-summary。終了コード 0 は clean、1 は感染、それ以外はエラー |
defender |
MpCmdRun.exe -Scan -ScanType 3 -File <path> -DisableRemediation。Windows では Program Files\Windows Defender から、WSL では C: ドライブのマウント上の Windows 版を wslpath -w で変換したパスで実行。「found no threats」付きの終了コード 0 は clean、2 は脅威、それ以外はエラー |
none |
エンジンなし。すべてのファイルが unscanned |
スキャンは最小限の環境変数と上限付きの実行時間(security.attachments.scanTimeoutSeconds、既定 120 秒)で実行し、失敗時は拒否します。タイムアウト、異常終了、未知の終了コード、判定のない出力はすべて scan_failed で、clean にはなりません。明示的に指定したスキャナーが未インストールの場合はすべてのスキャンが失敗し、none に切り替わることはありません。
security.attachments.requireScan(既定 true)は unscanned のファイルを拒否します。エンジンを導入できず、静的ポリシーだけを検査として受け入れる環境でのみ false にしてください。
{ security: { attachments: { scanner: "auto", // auto | clamav | defender | none requireScan: true, scanTimeoutSeconds: 120, extractTimeoutSeconds: 30, extractMaxOldSpaceMb: 256, }, },}分離されたテキスト抽出
「分離されたテキスト抽出」の見出し文書のパーサー(zip、XML、PDF)はゲートウェイのプロセスでは動きません。受け入れたファイルは、小さな V8 ヒープ(--max-old-space-size、既定 256 MB)、空の環境変数(トークン、プロキシ、NODE_OPTIONS なし)、標準入力からの要求1件、出力の上限、実行時間の上限(既定 30 秒、超えると強制終了)を持つ新しい Node 子プロセスが読みます。子プロセスのコードはネットワーク通信を行わず、ファイルを書かず、何も起動しません。パーサーの不具合や悪意のある文書が起こせるのは子プロセスの停止か異常終了だけです。ファイルは(スキャンを通過しているため)保存されたまま、ツールはテキストを取得できなかったことを返します。
監査とエビデンス
「監査とエビデンス」の見出し取り込みはすべて監査ログ(attachment.intake、ソース security.attachments)に、プロジェクト、コネクタ、メッセージと添付の ID、SHA-256、サイズ、種類、判定、スキャナー、拒否コードとともに記録します。ファイル名と内容は記録しません。拒否は、標準のエビデンス形式の署名付きバンドルとして <KOLO_HOME>/projects/<id>/security/attachments/<intakeId>/evidence/ にも封印します(kolo evidence verify で検証できます)。
オートパイロットの実行で
「オートパイロットの実行で」の見出しm365_mail_attachment_fetch は gather ステップで使える読み取りツールです。ルーティンは読んだメッセージの添付行に対してファンアウトします。
gather: - { id: inbox, tool: m365_mail_list, args: { top: 25 } } - id: mail tool: m365_mail_read each: { from: inbox, match: "id: (\\S+)", arg: id, max: 10 } - id: files tool: m365_mail_attachment_fetch each: { from: mail, match: "attachment: (\\S+)", arg: ref, max: 10 }添付が拒否されても実行は失敗しません。エンジンはそのメッセージに関する項目に malicious_attachment(ブロッキングフラグ:その項目の操作は一切実行しない)を付け、計画にそのメッセージの項目がない場合はエンジン自身が担当者向けの項目を作成します。フラグを解除できるのは人だけです(workitems.clearFlag、理由の記入が必要)。
脅威モデル
「脅威モデル」の見出し| 脅威 | 統制 | 残るリスク |
|---|---|---|
| 文書に偽装した実行形式やスクリプト | スキャナーの前にマジックバイトと拡張子のポリシー | ポリシーが知らない形式は許可リストにより拒否 |
マクロ付き文書(.docm を .docx に改名) |
vbaProject.bin、コンテンツタイプ、OLE の VBA を検査 |
許可リスト外の形式のマクロは非対応として拒否 |
| スキャナーが読めない暗号化ペイロード | 暗号化 zip と暗号化 Office を拒否 | なし:そのようなファイルはプロジェクトに届かない |
| zip 爆弾やパーサーの資源枯渇 | エントリ数・サイズ・圧縮率の上限、展開量の制限、強制終了される子プロセスで抽出 | パーサーの不具合で子プロセスが抽出の制限時間まで止まる可能性 |
| 許可形式(PDF、DOCX など)に含まれる既知のマルウェア | ClamAV または Defender のスキャン、失敗時は拒否、requireScan 有効 |
未知(ゼロデイ)のマルウェア:保存されたファイルは通常の注意で開く |
| モデルによる任意ファイルの取得 | 1回の呼び出しでサインイン中のメールボックスの添付1件、保存先はプロジェクトのみ | メールボックス所有者自身のメールは設計上の対象 |
| ログを通じたファイル名や内容の漏えい | 監査とエビデンスには ID、ハッシュ、コードのみ | 保存ファイルはプロジェクトフォルダーにあり、プロジェクトのアクセス規則に従う |