セキュリティツールを開発した。すると、自分自身に致命的な欠陥が見つかった。
私はコードセキュリティアナライザーを開発している。名前は vibeanalyzer と呼んでいる。
目的はシンプルだ。今、多くの人が「バイブ・コーディング(vibe-code)」をしている。AIエージェントにコードを書かせるのだ。コードは綺麗に見えるし、テストも通る。しかし、開発者はプロジェクトの中に実際に何が入っているのかを全く把握していない。
本腰を入れる前に、もっとずっと前にやっておくべきだったことをした。既存のツールがすでにこの問題を解決していないか確認したのだ。解決していた。Semgrep、CodeQL、Snykといったツールは、私よりも遥かに優れている。
自分のプロジェクトで Semgrep を実行してみた。その結果は、厳しい現実を突きつけるものだった。
Semgrep は私の依存関係の中に6つの問題を見つけた:
• ハッシュの選択に関する軽微な問題が1件。 • esbuild と vite における、重要度「High」の問題が2件。 • パストラバーサルに関する、重要度「Medium」の問題が3件。 • vitest における、重要度「Critical」の問題が1件。
vitest の問題はパストラバーサルの脆弱性だった。プロジェクト外のファイルを読み取ったり、実行したりすることを許してしまう可能性がある。その依存関係を導入したのは、私自身だった。
なぜセキュリティツールに致命的な脆弱性が存在するのだろうか?
答えはサプライチェーンにある。私のコードは誠実かもしれない。しかし、私がその上に構築しているツールが常に安全であるとは限らない。セキュリティツールを作っている最中にこれを見逃したのだとしたら、一般的な開発者がこれに気づく可能性はゼロに近い。
だからこそ、私は開発を続けている。
Semgrep のような既存のツールは、危険なパターンを見つける。既知の脆弱性を見つける。しかし、それらは「意図(intent)」を理解しない。あなたのコードが本来何をすべきだったのかを知らないのだ。
関数自体は安全であっても、その関数が「プロジェクト内に存在すべきではない問題」を解決しようとしている場合には、それを見抜くことができない。
私はこれを「インテント・ギャップ(intent gap)」と呼んでいる。コードとその目的との間にある距離のことだ。
Vibeanalyzer はこのギャップに焦点を当てる。このツールは、プロジェクトの意図(intent)と、あえて行わないこと(non-goals)をユーザーに問いかける。そしてガードレールを設定する。AIがコードを評価する際、AIはゴールを理解している。何が範囲外であるかも分かっているのだ。
意図の読み込み部分は完了した。基本的な TypeScript の解析とフォルダ構造のグラフ化はできている。次は AI レイヤーを構築しなければならない。AI が本当に「意図」に照らしてコードを評価できるのかは分からない。単に誤検知(false alarms)を生むだけかもしれない。それを確かめるために、オープンな形で開発を進めていく。
依存関係を更新し、既知のバグは解消した。しかし、未知の穴やロジックエラーは残っている。だからこそ、作業は続く。
Optional learning community: https://t.me/GyaanSetuAi
