脆弱性一覧を見ていたら気になったものがあったので検証してみました。
※この記事で知り得たことを悪用することは禁止とします。
Apache Druidとは?
Apache Druidとは、分散データストアのOSSです。
druid.apache.org
脆弱なバージョン
0.20.0以下のバージョン
脆弱性について
Apache Druidには、提供されたJavascriptを実行する機能があります。
Javascriptを実行する設定は、セキュリティの観点からデフォルトで無効になっています。
今回の脆弱性は、設定に関わらず強制的Javascriptを実行させるものでした。
対策
前提として、全公開するシステムではないので、アクセス制限をすることが必須となります。
(SQLが普通に実行されていたりします)
アクセス制限されていることを確認した上で、0.20.1以上にアップデートすることが推奨されています。
再現
※検証はローカルで行っています
修正前(0.20.0)
1.サービス起動
0.20.0が無事起動しました。

2.アクセス確認
正常にアクセス出来ることが確認できました。

3.poc実行・確認
リクエスト・レスポンスです。
ここでは「wget」コマンドを使用して、burpコラボレーターへアクセスしています。

ステータスが200となっています。
burpコラボレーターの様子です。
wgetから指定したパスにアクセスが来ていることが確認できます。

サーバ内のフォルダを見ると、「nick310」のファイルが取得されていることが確認できます。

これらの結果から、OSコマンドが実行されたということがわかりました。
修正後(0.20.2)
1.サービス起動
0.20.2が無事起動しました。

2.アクセス確認
正常にアクセス出来ることが確認できました。

3.poc実行・確認
リクエスト・レスポンスです。

0.20.0とは違い、500エラーとなりました。
メッセージにも「Javascriptが無効になっている」とあり、本来想定されている動作となっています。
フォルダにもファイルは作成されていません。

脆弱性の原因について
修正点や解説記事を読んでみたところ、空(“”)の名前を処理してしまうことが原因とのことでした。
修正コミットを見てみると、コメントとともに空の名前のチェックが入っています。
if (ac instanceof AnnotatedParameter) { final AnnotatedParameter ap = (AnnotatedParameter) ac; if (ap.hasAnnotation(JsonProperty.class)) { return JsonIgnoreProperties.Value.empty(); } } return JsonIgnoreProperties.Value.forIgnoredProperties("");
参考
修正のやりとりなど
github.com
私ではgithubだけでは読み取れないので、以下記事も参考にしました。
CVE-2021-25646: GETTING CODE EXECUTION ON APACHE DRUID
おわりに
Apache Druidの脆弱性でした。
手法として初めてみたので、修正方法もあわせて勉強になりました。
CVEの修正をたどってみるのは面白かったので今後も続けてみようと思います。
コメント