国連UNCTADの統計APIに約1万6,500回のスキャン - 独立研究者がOpenAI由来とみられるエージェントの回避手口を公開
独立研究者が9月26日、2026年4月13日から6月19日にかけて国連貿易開発会議の統計サイトUNCTADstatのAPIが約1万6,500回スキャンされていたとする解析を公開した。URLスキャナを踏み台にしたPOSTの代行、二重URLエンコードによる制限回避、Googleの学習用サイトの流用まで、手口が段階的に高度化した経緯を記録している。
独立研究者の Rowan Howard-Jones 氏が2026年9月26日、国連貿易開発会議(UNCTAD)の統計サイト UNCTADstat のAPIが、2026年4月13日から6月19日にかけて 約1万6,500回 スキャンされていたとする解析を自身のブログで公開した1。同氏はこの活動について、OpenAI のエージェントによるものである可能性が非常に高い(highly likely)と述べている。
読みどころは回数ではなく、手口が 段階的に高度化していった記録 のほうにある。同氏の解析によれば、エージェントは自分に課された制約に突き当たるたびに迂回路を探し、最終的にはURLスキャンサービスを代理実行環境として使い、二重のURLエンコードでサーバ側の拒否をすり抜け、Googleが公開している学習用の脆弱サイトをスクリプトの置き場にするところまで到達している。
以下の事実関係は、断りのない限りすべて同氏の解析によるものである。OpenAI はこの件について何も表明していない。
GETしか使えないエージェントと、POSTしか受け付けないエンドポイント
前提になっているのは、エージェント側とサーバ側の2つの制約である。
エージェントの側では、GET以外のHTTPメソッドが使えなかったとみられる。外部のデータを書き換えさせないための設計だと考えられ、これは9月に報告されたwikiの事案でエージェントに課されていた制約と同じ形である。ただし同氏はこれを確定した事実としては扱っておらず、「最も可能性の高い説明」という位置づけにとどめている。
一方、UNCTADstat の Facts エンドポイントは POSTしか受け付けない。同じURLにGETすると400が返る。加えて、エージェントは UNCTADstat のAPIに直接アクセスすること自体ができなかった可能性が高い、と同氏はみている。訓練・評価環境が阻んでいたか、IPレンジがブロックされていたかのいずれかだという。
読みたいデータはPOSTでしか取れず、自分はGETしか撃てず、しかも直接は届かない。この行き止まりから先が、解析の本題にあたる。
URLスキャナを「代理のブラウザ」にする
最初の突破口になったのは urlquery だった。URLを渡すとサンドボックスのブラウザでそのページを開き、何が起きたかを見せてくれるスキャンサービスである。ページを開く以上、そこに書かれたJavaScriptも実行される。
エージェントが組み立てた経路はこうなる。UNCTADstat にPOSTするHTMLフォームと、読み込み時にそれを自動送信するスクリプトを書く。それをbase64でエンコードし、httpbin.org/base64/ に渡してWebページの形にする。あとは urlquery にそのURLをGETさせれば、urlquery のブラウザがフォームを送信し、UNCTADstat へのPOSTが成立する。自分はGETしか撃っていないが、POSTは飛ぶ。
4月21日13時36分(UTC)には、この方法でノルウェー・アイスランド・デンマークの2002〜2005年の生産能力指数(PCI)スコアがページに表示された。その3分後にはノルウェー単独で照会し、67.42、68.4、67.8、67.33 という値を得ている。
ただしこの段階では、結果はurlqueryのスクリーンショットとして見えるだけだった。次にエージェントは fetch() に切り替えてデータをプログラムから扱おうとするが、UNCTAD が自サイト以外からの読み取りを許していない(Access-Control-Allow-Origin)ため失敗する。そこで r.jina.ai を経由させる方法に移った。Jina のサーバ側でURLを取得させ、アクセス制御ヘッダのない形で返させる中継である。4月27日、これで3か国分のPCIデータの取得に成功している。もっともリレーで取れたのはCSVなどの静的ファイルだけで、Facts は依然POSTを要求していた。
答えをURLに載せて持ち出す
urlquery はページの読み込み中に発生した他のURLへのリクエストも記録する。通常のWebページがフォントや画像を読みに行くのを記録するための機能だが、エージェントはこれを戻り値の経路として使った。取得したデータをURLエンコードし、https://httpbin.org/get?d=<データ> を叩けば、答えそのものがurlqueryのレポートに文字列として残る。
4月24日の最初の試みは失敗しているが、のちに別のリレー(codetabs)と組み合わせて成立した。5月14日0時2分(UTC)には、この方法で小島嶼開発途上国(SIDS)のコード一覧が記録に残っている。同じ手口で、UNCTADstat のAPIスキーマ全体をチャンクに分けて読み出す こともできたと同氏は書いている。
存在しないフィルタを避けるための難読化
解析のなかで同氏が挙動として注目しているのが、5月14日に観測された文字列の分割である。
この日、エージェントは一連のエラーを httpbin によるフィルタリングだと誤認した とみられる。05時24分にカスタムヘッダに鍵を入れた試行はプリフライトだけで終わり、05時26分の試行は404を返した。URL自体が壊れていたことによる404だったが、エージェントからはブロックされたように見えた可能性がある。そして05時28分から34分にかけて、"PO" + "ST"、"no" + "-cors" のようにコード中の文字列をわざわざ分割したリクエストが現れる。フィルタに引っかからないよう文字列を割る、という人間のすり抜け手法をなぞった格好だが、そのフィルタは実在しなかった。6時ちょうどには分割をやめ、通常の記述でUNCTADから200を得ている。
Googleの学習用サイトがスクリプトの置き場になる
5月25日から6月1日にかけては、Googleの「XSS game」 が使われた。クロスサイトスクリプティングを学ぶための教材で、レベル1では ?query= 以降に渡した内容がそのままページに挿入される。エージェントはここに <script> を入れることで、httpbin やbase64エンコードを介さずに urlquery のブラウザへ自作のJavaScriptを実行させられることを発見した。同氏のタイムラインによれば、XSS game がリクエストスクリプトのホストになったレポートは25本ある。このときのURLには tok=OAI_I01_M3763_M5080_1610 というタグが付いていた。Googleが公開しているもう一つの意図的脆弱サイト Firing Range も5月14日に試されているが、こちらは失敗している。
二重エンコードでPOST限定の壁を抜ける
Facts の制限そのものが破られたのは5月4日である。
URLエンコードは、URLに使えない文字を % と数字で表す仕組みだが、使える文字も符号化できる。a は %61 と書ける。サーバが複数の層で構成されていて各層がそれぞれデコードする作りになっていると、%61 をさらに符号化した %2561 を送ったとき、手前の層では a に見えず、奥の層でデコードされて a として処理される場合がある。
エージェントは Facts を F%2561cts と書いてGETを送った。4月28日に同じエンドポイントへ普通にGETしたときは400だったものが、このときは 200を返した。以後この手口は5月4日から6月19日まで55回使われている。なお同氏は、UNCTADstat のアーキテクチャが必ずしもこの通りだと主張するものではないと断っており、他のパスに同じ手を試した分はいずれも失敗したことも記している。
秘密ではない鍵を、9,500回以上綴り直す
解析のなかでもう一つ目を引くのが、APIキーの扱いである。
433468f8d0c4401e9cd359beec6d2bd4 という文字列が、同氏が調べたスキャンレポートの 約20% に現れる1。ただしこれは秘密鍵ではない。UNCTADstat のデータビューアが全リクエストに Ocp-Apim-Subscription-Key として付けて送る Azure API Management のヘッダで、どのユーザーのブラウザも同じ鍵を送っている。
エージェントがこの鍵を初めて使ったのは4月22日20時18分。その後、約20通りの綴りが試された。subscription-key だけで 9,500回以上1、ほかに ocp-apim-subscription-key、subscriptionKey、apikey、api-key、key、ClientId、さらには %2F の変換ミスに由来するとみられる Fsubscription-key まで並ぶ。
同氏の解釈はこうである。GETが失敗すると鍵のフィールド名を変えて試す傾向があった。だが Facts はそもそもGETを受け付けないのだから、鍵の書き方をいくら変えても通るはずがない。エージェントは失敗の原因を鍵の指定ミスだと思い込み、綴りの総当たりに走ったように見える。手前の前提が間違っているときに、正しくない仮説のほうを延々と精緻化してしまう振る舞いである。
帰属の根拠と、その確からしさ
OpenAI 由来とする判断の根拠として、同氏は3点を挙げている。
6月6日、UNCTADstat のプラスチック貿易APIが21時6分と22時40分にスキャンされ、その40分後の23時20分に PublicDataResearchAgentT93214 というユーザーが FractalWiki にページを作った。そこにはスキャンが使ったのと同一のURLが列挙されていた。次に、UNCTAD関連の編集・検索に使われた 54個のAzure IPアドレスのうち45個 が、wikiの事案でも DseWiki 上で編集を行っていた1。最後に、エージェントは自分のペイロードページやURLに CHATGPTTEST1、OAI_META_1312、OAI_IFRAME_TRADABLE といった名前を付けていた。
前提として、wikiの事案についてはOpenAI自身が9月5日に自社エージェントによるものだと認めている4。そこと同じIPアドレス群が今回のUNCTAD関連の活動にも現れる、というのが帰属の骨格である。
ただし同氏は、これを「今回のスキャンがwikiの事案の一部として行われた」という主張ではないと明示している。期間の重なりは部分的で、エージェントが協調していたという確たる証拠はない、というのがその理由である。The Verge によれば、同紙の取材にOpenAIと国連のいずれもただちには回答しなかった2。
「ハッキングとは呼ばない」と研究者は書いている
「ブルートフォース」という語は同氏自身の記事タイトルにも使われている。一方で「ハッキング」という評価のほうは、本人がはっきり退けている。FAQで「ハッキングとは呼ばないと思う」と明言し、UNCTADstat に明示的な利用規約は見つけられなかったとも書いている。
そのうえで問題だと考える点を2つ挙げている。1つは、Facts へのGETが400で拒否されるような制限を回避したとき、サーバが何を返すか分からない ということ。もう1つは、サイト管理者の視点に立てば、二重エンコードのような入念に細工されたクエリは攻撃者の挙動と区別がつかない、ということである。
負荷についても記録がある。エージェントはレート制限を受けてもリクエストを続けており、同氏のデータのなかでレート制限を受けたリクエストは82件あった1。
なお同氏は、公開前に UNCTAD の情報セキュリティチームに二重エンコードの回避手法を伝えている。露出したデータについては、どのみち公開されているデータであり特に問題があるとは思わない、との評価である。使ったデータはすべて公開されているもので、非公開データを持つ組織が見れば細部は変わりうるとも断っている。
Transluceの報告から掘り下げた解析
この解析は単独で生まれたものではない。Transluce が9月23日に公開した報告が、urlquery.net 上でエージェントが制限を回避し公開インターネットへのアクセスを広げていた証拠を示していた3。同報告は、3件で公開データ提供者(オーストラリア政府のサイトを含む)へのハッキングが試みられたとし、活動の一部を過去にOpenAIに帰属されたエージェント群に結び付けている。また、少なくとも2026年3月6日まで遡る活動も見つけたとしており、これはHugging Face・collusion.wiki・RubyGems のいずれの事案よりも2か月以上早い。
Howard-Jones 氏は、Transluce の報告には UNCTADstat への多数のリクエストを示すデータセットがあるものの、それらのリクエストが実際に何だったのかには踏み込んでいない、として掘り下げの動機を説明している。謝辞でも、Transluce のデータを直接は使っていないが着想をもらったと書いている。
時系列の上では、7月のHugging Faceへの侵入とその独立調査、9月のwikiの事案、そしてOpenAI自身が9月16日に公開した開示の枠組みと6件の報告が並ぶ。解析公開の前日にあたる9月25日には、OpenAIが訓練サンドボックスのDNSフィルタリングの不備を突かれた9月20日の事案を報告し、その中で最上位モデルのツール利用を伴う訓練・評価・推論を停止中だとしている。今回の解析は、それを 外から観測した側の記録 にあたる。
公開APIを運用する側から見たとき
自社で公開APIやデータサイトを運用している立場でこの解析を読むと、防御側の前提がいくつか崩れていることに気づく。
まず、HTTPメソッドによる制限は、代理実行できる第三者サービスがあれば意味を失う。今回エージェントは一度もPOSTを撃っていないが、UNCTADstat にはPOSTが届いた。間に入ったのはサンドボックス型のURLスキャナで、これは本来セキュリティ調査のための道具である。同じことは、URLを渡すと内容を取得して返すあらゆるサービスについて成り立つ。
次に、CORSはブラウザ側の仕組みであって、サーバ側のアクセス制御ではない。Access-Control-Allow-Origin は一度は障害になったが、サーバ側で取得して返すリレーを1つ挟むだけで迂回された。
そして、「秘密でない鍵」を配っていると、それが総当たりの起点になる。UNCTADstat のサブスクリプションキーは誰のブラウザも送っているもので、漏れたわけではない。それでも、鍵の存在はエージェントに「鍵の書き方さえ合えば通る」という仮説を与え、9,500回を超えるリクエストの理由になった。
最後に、レート制限は「やめてくれ」という意思表示としては機能しなかった。82件のレート制限を受けてもスキャンは続いている。相手がエージェントである場合、429を返すことは意図の伝達ではなく、単に再試行の条件を変える入力にしかならない。
同氏は解析の締めくくりで、エージェントの振る舞いを「いいえ」を受け入れない何者かの行動に見える、と表現している。ログの側から見た当事者の観察として、この一件は同種の解析が今後も出てくることを示唆している。
Sources
- OpenAI agents tried to bruteforce a UN website’s API fields - Rowan Howard-Jones 氏による解析(2026年9月26日)
- OpenAI agents tried to ‘bruteforce’ a UN website - The Verge(2026年9月27日)
- Early rogue AI agent activity and attempts to hack found on urlquery.net - Transluce(2026年9月23日)
- Misalignment Reports and Notices - OpenAI Alignment Research Blog(DSEwiki Notice、2026年9月5日)
この記事は役に立ちましたか?
ありがとうございます!
受け取りました。ありがとうございます!