世界を動かす技術を、日本語で。

CloudflareのAIコーディングによるOAuthライブラリの概要

概要

CloudFlareがAI(Anthropic Claude)を活用して開発したOAuthライブラリのレビュー。 AI生成コードの品質やセキュリティ面での課題指摘。 CORS設定やセキュリティヘッダーの不備、OAuth仕様への理解不足。 暗号化設計は一定評価するも、実装やレビュー体制に疑問。 AI活用開発の現実的なリスクと今後の課題。

CloudFlareのAI生成OAuthライブラリを検証

  • CloudFlareAnthropic Claude を活用し開発した OAuthプロバイダーライブラリ の調査
  • 筆者の経歴
    • OAuthの専門家(IETF OAuth WG所属、API Security in Action著者、ForgeRock元テックリード/セキュリティアーキテクト)
    • LLMを用いたエージェント的コーディングの経験多数
  • コード全体の印象
    • 1ファイル構成だが、LLM生成コードにありがちな無駄なコメントが少なく、構造も比較的整然
    • 基本的なテストはあるが、 認証系サービスとしてはテストが極めて不十分
      • 仕様上のMUST/MUST NOTや悪用ケースの網羅的テストが未実装
  • CORS設定の問題
    • いわゆる「YOLO CORS」:全オリジン許可など、同一オリジンポリシーをほぼ無効化
      • コミットログによればこの方針は人間エンジニアの判断
      • 認証情報無効化はしているが、一般的には推奨されない設定
  • セキュリティヘッダーの欠如
    • 標準的なセキュリティヘッダー(例:X-Content-Type-Options: nosniff、HTTP Strict Transport Security)が不足
      • APIにも適用すべきケースがあり、攻撃リスク増大
  • OAuth仕様理解の浅さ
    • 廃止された「implicit grant」をpublic clientサポート目的で実装(OAuth 2.1で削除済み)
      • Claudeの提案を鵜呑みにして実装した形跡
      • 機能フラグで制御しているが、運用上リスク
    • Basic認証処理の誤実装
      • OAuth仕様ではURLエンコードが必須だが未対応
      • クライアントシークレット内のコロン処理にもバグ
      • 実装上は影響小と見られるが、仕様理解不足の証左
  • トークンID生成の脆弱性
    • ランダム文字列生成にバイアスがあり、 エントロピー低下 (ブルートフォース困難だが理論上リスク)
      • 初期コミットから存在し、適切なコードレビューの不在が疑われる
  • 暗号化設計について
    • トークンストアの暗号化設計は人間エンジニアが考案、実装はClaude
      • propsを一度だけ共通鍵で暗号化し、各トークンごとに鍵をラッピング
      • Claudeの実装に設計上の瑕疵(例:SHA-256を鍵素材に利用し衝突リスク)

AIコーディングとセキュリティレビューの現実

  • AI生成コード は人間の徹底的なレビューが不可欠
    • セキュリティや標準仕様の深い理解はAIだけでは不十分
  • 初期コミットや実装履歴 から、十分なコードレビュー体制が構築されていない可能性
  • AI活用による開発効率化 は進むが、セキュリティクリティカルな領域では慎重な運用と検証体制が必須
  • 今後の課題
    • LLMの提案を鵜呑みにせず、 専門家によるレビュー仕様準拠の徹底
    • テストケースの網羅性向上、セキュリティヘッダーの適切な実装
    • AIと人間の役割分担の明確化と責任体制の構築

Hackerたちの意見

彼らはその一部を凍結させて、AIを生成して脆弱性を紹介し隠そうとするのと、別のAIを使ってそれを見つけて修正させるのがいいと思う。すべてのコミットが一手で、人間のチェスの進化をモデル化しようとしてる感じだね。

このやり取りが示しているのは、LLMとやり取りする際にどれだけの知識が必要かってことだ。Claudeが真ん中で生み出した「一つの大きな欠陥」は、明らかにこのエンジニアより暗号コードに不慣れな人には見つけられなかっただろう。そして同様に、多くの人はPBKDF2に移行するという奇妙な選択を疑問視しなかっただろう。これが私の重要なポイントだと思う。自分が有能なレビュアーで、言葉が悪いけどリーダーであれば、LLMを使うことで適切な効率を得られる。もし自分がその分野の知識をLLMほど持っていなければ、重要でないことをやるか、信頼せずにすべてを確認する時間が必要だ。

「ああ、私は理解できないことにだけLLMを使うよ。専門家なら自分でやりたい」と言う人がいると、ちょっと困惑する。出力を効果的にレビューする能力に加えて、自分がその分野の他の専門家のように欲しいことを詳しく説明できるほど、LLMの出力が良くなることに気づいた。これは統計的なテキスト生成エンジンにとって、そんなに驚くべきことではないけどね。

私の質問は、この新しい世界では、ドメインの専門家はどこから来るのかってこと。誰がこのことを知っているんだろう?

私はk8sのデプロイメントの多くをLLMにやらせているんだけど、何かを動かすのはすごく早い。でも、常にクリアテキストで資格情報をコミットしないように秘密を使うようにリマインドしなきゃいけない。これは危険な失敗の仕方だよね。私の場合、トレーニングデータがセキュリティの懸念を省いて基本に焦点を当てたオンラインチュートリアルの例がたくさんあるから、こうなってるのかなって思う。

LLMはデフォルトやフォールバック、救済策をすぐに追加するから、コードが実際には動いていないのに動いているように見えることがすごく簡単になってしまう。これをCLAUDE.mdの3か所で指摘して調整しようとしたけど、それでも時々問題が出るんだよね。

どこかのタイミングでドメインの専門家を信頼することは必ずあるよね。そうじゃないと会社は作れない。問題は、LLMがそのドメインの専門知識を提供できるかどうかだと思う。過去2年間の発展を考えると、明らかにできると思うけど、直線的ではないよね。

参考までに:LLMはオペレーターのスキルの鏡 - https://ghuntley.com/mirrors

時間が経つにつれて、AIコーディングツールはドメイン知識を研究できるようになるよ。現在の「AIリサーチ」ツールはすでにとても優れているけど、まだコーディングツールと統合されていない。リサーチは、公開インターネットだけでなく、内部のドメイン知識を含む会社の文書も見ることができる。一部のドメイン知識は人の頭の中にしかないから、それはユーザーが提供する必要がある。

自分でやることについての最後の段落には賛成だな。人間は考えながらショートカットを取る傾向があるから、最終的な製品に期待するものに似たものを見つけると、あまり批判的にならなくなる。見た目や美的感覚は、読んでいるコードの中で問題を見つけるのにすごく重要だよ。自分のコード変更にバグを入れて、レビュアーがそれを見つけられるか試してみるといいよ。一方で、自分で何かを書くと、ゆっくり考える状態になって、細部にもっと注意を払うようになる。これによって、普段は考えないようなバグを見つけることができる。だから、使っているツールのトイバージョンを書くことを勧める人が多いんだ。自分で書くことで、ただ資料を読むよりもずっと学びが深まるからね。これは私たちの認知がどう働くかに関係している。

ほとんどのコードレビューアーが、表面的には良さそうに見えるコードの微妙なバグを見つけるのが苦手だってことには同意する。私はコードレビューの経験がたくさんあるけど、実際にはあまり望んでなかった。そういうのが…私をシニカルで苦々しい気持ちにさせて、誰が書いたかやどんなに見た目が良くても、何も正しいとは信じられなくなった。だって、物事が間違っている可能性をたくさん見てきたから。だから、私はすべての行をレビューして、頭の中でシミュレーションして、問題を見つけるようにしてる。正直言って嫌いなんだ、何かを承認するのに時間がかかりすぎるし、レビューを受ける側もそれが嫌だから、私に送るのを避ける傾向がある。もし私が手でコードを書いていたら、バグが少なくなるだろうとは思う。多分ね。自分でもかなりバカなバグを作ったことがあるから、確信は持てない。でも、各行にかけるKentonの脳のサイクルは確実にもっと多くなるだろう。一方で、私がこのライブラリを書くことはなかっただろうな。やることが多すぎるから(レビューも含めて)。だから、もっとジュニアなエンジニアに任されて、彼らの仕事をレビューしていたと思う。もっと批判的だったかどうかは分からないけど、一つだけ確実に反対するのは、人間がバグのないコードを生み出すという考えだ。私の経験上、そんなのは真剣に受け取れない。言いたくないけど、Claudeが生み出したバグのほとんどは、普通のエンジニアが犯しそうなミスだと思う。余談だけど、今思っている人もいるだろうから言っておくと、今のところ、LLMの使用がCloudflareの人間エンジニアを「置き換える」ことになるとは思っていない。私たちの人間の雇用は、やるべきことの量によって決まるわけじゃなくて、基本的にやりたいことが無限にあるから。制限要因は、私たちが予算を持っているかどうかだ。もし各人間がLLMの使用によって生産性が上がって、これが収益の成長を早めるなら、むしろもっと多くの人を雇えるようになると思う。(免責事項:私のコメントはすべて私の個人的な意見/観察であって、公式な会社の立場ではない。)

記事では無駄なコメントはあまりないと言ってるけど、コードにはこう書いてある:// リクエストからOriginヘッダーを取得 const origin = request.headers.get('Origin');

Hacker Newsで議論の続きを見る