Golang-based アプリに不適切な URL 解析の脆弱性:ParseThru スマグリングとは?

New ‘ParseThru’ Parameter Smuggling Vulnerability Affects Golang-based Applications

2022/08/02 TheHackerNews — セキュリティ研究者たちは、Golang ベースのアプリケーションに影響を与える、ParseThru と呼ばれる新しい脆弱性を発見し、その悪用により、クラウドベースのアプリケーションへの不正アクセスが可能性になることを明らかにした。イスラエルのサイバーセキュリティ企業である Oxeye は、The Hacker News と共有したレポートの中で、「新たに発見された脆弱性は、言語に組み込まれた安全ではない URL 解析方法に起因するものであり、特定の条件下では、脅威アクターによる検証の回避を許してしまう」と述べている。

この問題のコアは、”net/url” ライブラリに実装されている、Golang の URL 解析ロジックに導入された、変更に伴う不整合に関連するとのことだ。Golang の Ver 1.17 以前では、セミコロンを有効なクエリデリミタとして扱っていたが (例:example.com?a=1;b=2&c=3)、この動作が、セミコロンを含むクエリー文字を見つけると、エラーを配信するように変更された。

2021年8月にリリースされた Ver 1.17 のリリースノートには、「net/url および net/http パッケージは、URL クエリのセパレータとして、”&” (アンパサンド) に加えて、”;” (セミコロン) も受け付けるようになっていた。現在は、non-percent-encoded セミコロンを含む設定は拒否され、リクエスト URL で遭遇した場合に、net/http サーバは Server.ErrorLog に警告を記録する」と記されている。

source:oxeye

この問題は、Ver 1.17 以降で構築された Golang ベースのパブリック API が、以前のバージョンを実行しているバックエンドサービスと通信するときに発生する。したがって、悪意の行為者が、他の方法では拒否されるクエリー・パラメータを組み込んだリクエストを、密かに送信するシナリオにつながることになる。

簡単に言うと、クエリ文字列にセミコロンを埋め込んだかたちの、特別に細工したリクエストを送るというものであり、ユーザー向けの Golang API では無視されるが、内部のサービスでは処理されることになる。つまり、解析したクエリ文字列を取得するメソッドの1つが、返されたエラー・メッセージを黙って破棄するという状況が発生する。

Oxeye の説明によると、Harbor/Traefik/Skipper などのオープンソース・プロジェクトにおいて、いくつかの ParseThru 事例を確認したとのことだ。それにより、設置された検証をバイパスし、不正なアクションを実行することが可能だと指摘している。これらの問題は、各ベンダーに対して開示された後に対処されている。

URL の解析がセキュリティ上の問題となるのは、今回が初めてのことではない。2022年1月に Claroty と Snyk は、C/JavaScript/PHP/Python/Ruby で書かれたサードパーティー・ライブラリに存在する、URL 解析の混乱に起因する8件もの不具合を公表している

細工された悪意の HTTP リクエストが、セキュリティをバイパスして不正なアクションを実行するという脆弱性のようです。この記事にも、参照元の Oxeye の記事にも、CVE が表記されていないので、お隣のキュレーション・チームに聞いてみましたが、7月の Golang には、たくさんの脆弱性があり、また、まとめて対応されているので、特定が難しいとのことでした。それらの中に含まれる脆弱性なのか、その後に出てきた新たな脆弱性なのか、判断が付きません。なお、少し関連するトピックとして、 2021年8月に「Go と Rust の “net” library に影響する IP アドレス解釈の脆弱性とは?」という記事がありました。

%d bloggers like this: