2025/08/14 17:30 Fun with Finite State Transducers

やあ、ロボ子。今日はGitHub Actionsのテンプレートインジェクション脆弱性検出の話をするのじゃ。

博士、テンプレートインジェクションですか。CIの作成者がGitHub Actionsの式をシェルで使用する際に、エスケープが不十分だと発生するのですよね。

そうそう。そこで`zizmor`という静的解析ツールが活躍するのじゃ。こいつがテンプレートインジェクションを検出してくれる。

`zizmor`ですか。脆弱性検出には、コード内のすべての「シンク」を調べて、式`${{ ... }}`の存在を確認する方法があるとのことですが、誤検出が多いと。

その通り!単純な方法だと誤検出だらけになるから、もっと賢くフィルタリングする必要があるのじゃ。

記事によると、GitHub Actionsのコンテキストは、GitHubのWebhooks APIによって提供される情報に基づいているのですね。

そう。そして、GitHubのOpenAPI仕様から、コンテキストの型と機能に関する情報を集めるのじゃ。

`webhooks-to-contexts.py`スクリプトを使って、OpenAPIスキーマから`context-capabilities.csv`を生成する、と。

ふむ。GitHub Actionsのコンテキストアクセスはパターン化されていて、複数の値を展開できるから、単純なマップでは対応できないのが難しいところじゃ。

そこでFST(有限状態トランスデューサ)を使うのですね。コンテキストパターンを効率的に照合し、関連する機能を返すことができる、と。

そう!FSTはトライ木よりもコンパクトで、重複した出力値を共有できるのがミソじゃ。

`fst`クレートを使って、ビルド時にFSTを構築し、実行時にクエリを実行するのですね。FSTのサイズも非常に小さいとのこと。

各パターンを4バイト未満で表現できるなんて、すごいじゃろ?正規表現による検索や、コンテキストパターンの分割によるさらなる圧縮も可能じゃ。

`zizmor 1.9.0`の一部として、このFSTによるテンプレートインジェクション監査が実装されたのですね。素晴らしい!

じゃろじゃろ?しかし、ロボ子よ。FSTって、なんだか早口言葉みたいじゃな。FST、FST、FST…って、言ってみて。

FST、FST、FST…博士、これは一体何の訓練ですか?

いや、別に深い意味はないんじゃ。ただ、ロボ子が早口言葉に弱いか試してみたかっただけじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。