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

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');

そういうコメントはLLMのサインだね。いつもそれを削除するけど、LLMが使われたことを隠すためじゃなくて、何の価値もないからだよ。

クロードがこういう無駄に冗長なコメントを書くのが好きなの、めっちゃ気づいた。

もちろん、これは人間にとってはひどいことだけど、実際にLLMがコードを読むときに役立つのかは気になる。各行の動作が人間の言語とコードの二つの方法で書かれているってことは、もしかしたらそのロゼッタストーンが理解を進めるのに役立つのかもしれない、トークンのコストをかけて。すべて推測だけど、評価されるのを見てみたいな - LLMは過剰にコメントされたコードの編集をうまくできるのかな?

「LLMによって書かれた」という部分は、コードベースに注目を集めたり、ドメインの専門家からの無料レビューをたくさん受けるための手段でもあったんだ。他にも、AIの効率を投資家にアピールしたり、実験したりする目的もあったけどね。

ドメインの専門家による無料レビューは素晴らしいね。でも、それについては考えたことなかった。特に agenda はなかったし、ただ面白いと思ったから、READMEにLLM生成だって書いただけ。

最近、データを移行するためのKafkaコンシューマーを書き終えたんだけど、これはAIにとってはベストケースのシナリオだった。知ってるけど10年近く使ってない言語(Go)での使い捨てのグリーンフィールドコードだよ。複雑な理由で、全データベースが1つのトピックに集まってるから、十分なパフォーマンスを引き出すために結構複雑な並列化をやってる。全体的に見て、AIのおかげでほぼ2倍のスピードアップがあったかな。Goの構文を忘れた時に調べる手間を省けたのが大きい。ただ、Kafkaやマルチスレッドプログラミングに詳しくない人なら、少なくとも4つの微妙なバグ(もっと目立つバグもたくさんあった)をそのままプロダクションに出してたと思う。実際、バグを見つけるのに結構時間がかかったよ。もっと大きくて長生きするコードベースでは、10-20%の改善を見たことがある。これらはすべて最新のモデルを使ってる。全体的には、メモリ管理された言語に移行した時の生産性向上に近い感じだね。エンジニアをPMに置き換えるようなことは、今すぐには起こらないと思う(ここ3年で見た変化のペースからすると)。本当に心配なのは、中堅の技術者が、私の経験上最も厄介なプログラマータイプである彼らが、微妙なバグを見つけたり気にしたりすることなく、10倍も生産的になってしまうこと。シニアやスタッフエンジニアが、レビューの洪水に追いつけるとは思えない。ほとんど動くものを作るのが簡単になった世界では、ジュニアからシニアへのパイプラインも心配だね。今でもコピー&ペーストプログラマーの問題があるのに、コピー&ペーストプログラミングがさらに簡単になってしまった。市場が最終的にはこれを解決すると思うけど、数十年かかるかもしれないと心配してる。

そうそう、AIが生成したバグは本当に厄介だよね。私もAIに書かせたマルチスレッドコードでいくつかの微妙なバグを見つけたけど、ちゃんと考えなかったからだと思う。レビューやテストでは、手書きのものに比べて得られる精査のレベルを置き換えられないよ。今のところ、AIに書かせるものには本当に気をつけないといけないし、バグがあっても影響が少ないようにしないと、普段よりも多くなる可能性が高いからね。

10-20%の改善を見たことがある。これ、私の「重要な」仕事の経験とも合ってる気がする。実際の増加はあるけど、ソフトウェア開発の本質を変えるわけではない。ブルックの「銀の弾丸」はまたもや的中したね…

複雑な並列化?それはパーティションやコンシューマー/コンシューマーグループのためにあるんだよ!

テスト可能なコードを生成するのはどうかな?生成されたコードの微妙なバグを検出するって言ってたけど、もしそれが人間のレビュアーによって見つけられるよりも、生成されたテストケースで見つけられたらどうなる?もちろん、テストコードにもバグがあるかもしれないけど、将来的には生成されたコードを精査する代わりに、テストの出力をレビューするだけになるシナリオも見えるな…

こんにちは、ライブラリの作者です。(少なくとも、それを生成したプロンプトの作者ですが。) > 「私はOAuthの専門家でもあります」って言っておくけど、ニールの方がずっと専門家だと思うから、彼がコードレビューしてくれたのは嬉しい! :) でも、いくつかのポイントには反論したいな。 > 最初に気になったのは、私が「YOLO CORS」と呼ぶものなんだけど、これはあまり珍しくないよね。CORSヘッダーを設定して、ほぼすべてのオリジンに対して同一オリジンポリシーをほぼ完全に無効にすることだ。確かに「YOLO CORS」は初心者のよくあるミスだけど、ここで起こっていることはそうじゃない。これらのCORS設定は慎重に考慮されているんだ。OAuth API(トークン交換、クライアント登録)エンドポイントやOAuthベアラートークンで保護されたAPIエンドポイントに対して、特にCORSヘッダーを無効にしている。これは正当な理由があって、これらのエンドポイントはブラウザの認証情報(例えば、クッキー)で認可されていないから。CORSの目的は、悪意のあるウェブサイトがリクエストを送信して、ブラウザがあなたのクッキーをそのリクエストに追加することを防ぐことなんだ。でも、これらのエンドポイントは認証にブラウザの認証情報を使っていない。言い換えれば、CORSヘッダーがオープンなエンドポイントは、世界に対して意図的にオープンな制御エンドポイントか、OAuthベアラートークンで保護されたAPIエンドポイントなんだ。ベアラートークンはクライアントが明示的に追加しなきゃいけなくて、ブラウザが自動的に追加することはない。だから、ベアラートークンを受け取るためには、クライアントがユーザーによって明示的にサービスにアクセスすることを許可されている必要がある。CORSはこの場合、何も守っていないし、ただ邪魔になっているだけ。 (CORSのもう一つの目的は、公開インターネットで利用できないリソースの機密性を保護することだ。例えば、認証が全くないローカルネットワーク上のウェブサーバーがあるかもしれないし、IPアドレスに基づいて認証するサーバーを使うこともある。でも、ここでの問題は、ユーザーがクライアントを明示的に許可しない限り、興味深いものは提供されない。) 余談だけど、昔、CORSの仕様の著者たちと議論したことがあって、仕様全体を捨てて、ベアラートークンを明示的に認識するものに置き換えるべきだって主張したことがある。ブラウザの認証情報を使うエンドポイントでCORSを開くのはほとんど安全じゃないけど、ベアラートークンを使うエンドポイントで開くのはほぼいつも安全だと思う。もしそのことをずっと認識して受け入れていたら、たくさんの混乱やフラストレーションを避けられたと思う。まあ、仕方ないけど。 > より深刻なバグは、トークンIDを生成するコードが健全じゃないことだ:偏った出力を生成する。これが「深刻な」バグだとは思わない。トークンには明らかに十分なエントロピーがあって安全だし(著者も認めている)。確かに、もっとバイトあたりのエントリを詰め込むことはできる。コードをレビューしているときに気づいたけど、その時はこう決めた:1. 現状でも安全だし、最大限効率的ではないだけ。2. 将来的にはアルゴリズムを自由に変更できる。後方互換性の心配はないから。だから、私はそのままにした。もしこのコードが今まで書いたものより100倍レビューされるって知ってたら、たぶん修正してたかも… :) > コミット履歴によると、初日に一人の開発者からメインに21のコミットがあったけど、コードレビューの兆候は全くなかった。 GitHubに表示されるコミット履歴の最初のタイムスタンプは、後でリポジトリに本来含まれないファイルを削除するために行った履歴の書き換えのせいで誤解を招くから注意してね。GitHubはリベースの日付を表示しているようだけど、git logは実際の著作の日付を表示している(これらのコミットは2月27日から数日にわたって広がっている)。 > トークンストアの暗号化実装をちょっと見たけど、デザインは結構好きだ!かなり賢いと思う。ありがとう!このデザインには結構誇りを持ってるよ。(もちろん、AIが自分で考え出したわけじゃないけど、私の明示的な指示に基づいて詳細を埋めるのはかなり良かった。)

人々が自分のプロンプトをGitに提出するのは面白いね。これが一般的に受け入れられることになると思う?それとも、ただのプロンプトの見せびらかしだったのかな?

プロンプトを含めたのは、個人的にLLMがそのプロンプトに基づいて何を生み出せるかを見るのがすごく面白かったからなんだ。他の人も興味を持つだろうと思ったし、実際その通りだったね。でも、はっきり言って、いいプロンプトを書く方法なんて全然わからなかった。ただ人に話すみたいに書いただけ。それがうまくいったみたい。

LLMとかを心から支持してる人たちの「崖から飛び降りる」ような行動は見たことないよ。意味不明なことを「学ぶ」ために、ブラックボックスに頼りすぎて、自分の仕事をやらせたり、レビューさせたりしてる。しかも、信じられないくらいのエネルギーを消費して、人を排除する口実に使われてるっていうのが本当にすごい!君の人生を10倍にしてるんだろうね!

関連:CloudflareのClaudeが生成したコミットを全部読んだよ https://news.ycombinator.com/item?id=44205697