※脆弱性診断を行う上でのスキルアップとして検証を行っております。この記事で知り得たことを悪用することは禁止とします。
pentesterlabでprototype pollutionをやったので、身近なもので同じ脆弱性発生しているもの無いかなぁと思ってやりました。
脆弱性情報
jquryについて
jqueryはクライアントサイドjavascriptのライブラリです。
jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.
jquery https://jquery.com/
prototype pollutionについて
正式にどのような表現が使われているかわかりませんが、共通オブジェクトを変更する事ができる脆弱性です。
コンソールで試すと以下のようになりました。
test1とtest2の変数を用意し、test1の「__proto__」のtestに文字列を代入します。
すると、test2の方もtest1に代入した文字列が表示されるようになります。

どういう仕様かわかりませんが、配列の要素に「__proto__」を使用することでも同様の現象が起こります。
test[“__proto__”]に{“admin”:123456}を代入すると、testにadminプロパティが作成され、代入した値のみが入る(この例だと123456)形になります。
test[“user”]に{“user”:999999}を代入すると、testにuserプロパティが作成され、代入したJSONそのものが入る形になります。

影響
既存のプロパティが追加または変更される可能性があります。
その結果、DoSやリモートコード実行につながる可能性があります。
また、プロパティが変更されることにより、ロジックの回避や権限の昇格につながることもあります。
対策
最新版にアップデートする。
簡易動作検証まとめ
関数?オブジェクト?名の検証がされていないため、配列の要素に「__proto__」を指定することが可能になる。
そのため、「arr[“__proto__”]=なんちゃら」のようにプロトタイプを変更することが可能になる。
調査過程について
動作検証
まずは現象を確認するべく、3.3.1と3.4.1をダウンロードしました。
以下記事の検証コードを使用することで脆弱性の動作を確認することが出来ました。

let a = $.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode);
console.logの結果です。
3.3.1
true
3.4.1
undefined
修正点確認
動作が確認できたので、修正点を確認することにしました。

目についたところでは、nameが「__proto__」であるかの検証が追加されていました。
試しにこの検証を削除してみるとprototype pollutionが発生しました。



javascriptに詳しいわけではないので、ソースコードを読んだだけだと何しているか理解が進まないです。
処理の中で取り扱っているデータを実際に見ていきます。
「name」の内容を確認していたので、nameが何なのか見てみます。


たくさん出てきました。
少し調べてみると、jQueryの関数っぽいですね。
「__proto__」も含まれています。
nameに「__proto__」が含まれているので、nameを配列の要素として使用していて、代入しているところを探します。
2箇所ありましたのでconsole.logを設定しました。


結果はめちゃくちゃに出てきたのでフィルターしました。
「__proto__」を使用しているのは1箇所目の方でした。
devModeを表示するようにピンポイントな修正を加えたところ、見事に内容が表示されました。


学んだこと
javascriptで配列のマージは「__proto__」のチェックを行わなければいけなさそう。
終わりに
jqueryのprototype pollutionの検証でした。
jqueryは古いバージョンをよく見かけるので、それに存在する脆弱性がどんなものか気になっていました。
いくつもある脆弱性のうちの一つですが、知れてスッキリしました。
prototype pollutionはCTFでも取り上げられたり、javascriptの仕様の問題として取り上げられたりしているのをまぁまぁ見かけました。
私はjavascriptが好きとかそういうわけではなく、この瞬間に気になって調べただけなので細かいことなどはわかりません。
技術的な指摘が飛んできたら嫌だなぁと思ったのですが、せっかくなので記事にしました。
ソースコードをいじりながら検証するのは楽しかったので、またjqueryをいじいじしてみようと思います。
参考
pentesterlab JS Prototype Pollution
After three years of silence, a new jQuery prototype pollution vulnerability emerges once again
コメント