OSSでTakumiを回した所感と反映した内容紹介
Takumiのオープンソース開発者応援プログラムに選ばれて、Takumiを3ヶ月無料で利用できるようになったので、現在試し中です。
Takumiはソースコードをしっかり読んでセキュリティの問題を見つけてくれるAIで、指摘内容がしっかり読まないと理解できないような報告である点が非常に好印象です。一方で、今回診断してもらったrepoはCLIツールなので、Webアプリ前提の助言が刺さらない場面が多くありました。
また修正方法までは出してくれない(簡単な変更は出してくれることはある)のは少し惜しいと感じています。言いたいことは分かるが、実際どうすれば解決するのか、という点は自分や他のAIに考えてもらう必要がありました。
使いどころがうまくハマれば十分役に立つし、運用と組み合わせると良さそうな印象です。以下でよかった点と気になった点を紹介します。
よかった点
- ソースコードをじっくり読み、観察結果をレポート化してくれる。読み込まないと気づきにくい箇所も拾ってくれる。
- セキュリティ専用ではなく、セキュリティ以外の相談でも「まず読む」動きをしてくれるので、色々な用途に使いやすい。
- これについてはサービスの売りなのかはよく分かっていない。
- レビュー実行中にWeb画面を離れてよい旨が明示され、実行待ちのストレスが少ない。
気になった点
- レポートがWebアプリ前提で、CLIツールでは優先度が低い指摘が混ざる
- CLIツールは「ユーザーの入力通りに動かす」ことが重要であり、過剰な防御はUX悪化や互換性破壊につながりうる。
- 「指摘はあるが、どう直すか」が提示されない
- 修正の方向性・パッチ例・副作用の説明が欠けており、実装に落とし込みづらい。実際の実装は他のAIに相談して、その後にTakumiでレビューを回すのが良さそう。
- 誤操作時のキャンセルや再実行ができない。
- 新しいGoの機能を重大な誤りとして報告してきたため、新しいGoの仕様に追随できていない可能性がある。
- どれくらいのクレジットを消費するのか、事前に予測できない。
- 1クレジットもかからずにサクッと終わることもあれば、10クレジット以上を消費してじっくり見ることもある。
オープンソース開発者応援プログラムのユーザー視点で気になる点
- 基本的に実行に時間がかかるので、外出先で実行中のレポートの結果を確認したいことがあった。しかし現状スマートフォンでは閲覧できない。
- 企業利用ならSlack連携は便利だが、個人では有料Slackを使わないことも多いのでSlackだとログが残らない。ログが残るTakumi上で完結させたいが、UIが簡素で「Slack前提」の温度感を受ける。
実際に直したPRの紹介
ここからは、Takumiの指摘から実際に直した内容をいくつか紹介します。
kekkai
ファイル改竄検知ツール。マニフェストはS3に保存して自己改竄を防ぐ構成でアプリケーション(例:PHP)のソース改竄を簡単に検知することができる。
保存パスに特殊文字を渡せてしまう
- これまで:S3の保存パス決定などに
--app-nameと--base-pathを利用しているが、ここに/などの特殊文字を渡すことができた。 - 対応:受け付ける文字種を制限・正規化して、安全なパスに制御した。
固定のtmpファイルをrenameするので複数プロセス起動時にrace conditionが起こりうる
- これまで:キャッシュファイルを作成する際に
ファイル名.tmpという固定のファイルに書きこんでからrenameで置き換える実装だったが、複数プロセス同時起動時に同じファイルを互いに書き合って衝突する。 - 対応:
os.CreateTempを利用して競合しない一時ファイルを作成するように変更した。この辺りの考え方は自分がこれまでやってきた内容も含めて別記事にしています。
workers指定で自己DoSができる
- これまで:
-workersで並列数を任意に増やせるので、極端な値を入れると自身に過剰負荷をかけうる。 - 対応:実行環境のCPU数を上限にキャップするようにした。
存在しないcache-dirを受け付ける
- これまで:
-cache-dirに存在しないディレクトリを渡せてしまう。 - 対応:早期に検証してエラーにするように変更。
notify_slack
CLIでSlackに手軽に通知することができるツール。他のCLIツールの出力をpipeで渡す機能と、ファイルをpostする機能の2つがある。
ファイルアップロード時の容量・メモリ制限
- これまで:Slack APIのrate limitや容量制限を考慮せず、指定ファイルをそのまま読み込んでアップロード。でかいファイルを渡すと全部メモリに載せようとするのでマシンごと死ぬ可能性もあった。
- 対応:SlackのAPIに合わせて容量制限を導入。
io.LimitReaderで読み取り自体をハードに制限して、メモリを食い尽くさないようにした。
debugログに秘匿情報が出る問題
- これまで:
-debugを有効にすると、Slackのtokenのような秘匿情報まで出力してしまう。 - 対応:デバッグ出力から秘匿情報を除外・マスクするように整理。
private-isu
社内ISUCONやISUCON練習に利用できるリポジトリ。複数の言語実装がある。セキュリティではないが、複数言語で非互換になっていた箇所を探し、いくつか修正(想定された使い方なのかは不明)。興味があればコミットを追ってみてください。
感謝
オープンソース開発者応援プログラムとして無料で試せるのはありがたいです。期間中、引き続き使い倒してみます。GitHubでリポジトリを公開している方は、ぜひ申請してみると良いと思います。
まとめ
- Takumiはソースコードをじっくり読むAIで、うれしい指摘が多い。一方で、CLI前提の設計判断や最新Go言語機能への追随は苦手そう。
- 「どう直すか」が出ないので、実装は別のAIか自分でやって、最終レビューにTakumiを回すとバランスが良さそう。
- オープンソース開発者応援プログラムはオープンソースをやっている人は申請する価値がある。
Discussion