提供: Japanese Scratch-Wiki

このきじは ひらがなのページがありません。ごめんなさい。
SandCastleIcon.png このページには、ScratchのWebサイトまたはWikipedia,Scratch Wiki以外へのリンクがあります。 他のサイトの安全を保証することはできないため、インターネットを使用する際は常に安全を忘れないようにしてください。
加工されたproject.jsonファイル。開くと、https://example.com/test.jsが読み込まれた。

CVE-2020-14000は、Scratch 3.0に使われているライブラリー、scratch-vmの脆弱性である。拡張機能の読み込み動作を悪用して、任意のJavaScriptファイルを読み込み、Web Worker内で実行することができるものである。

この脆弱性は2020年6月9日にapple502jによって発見され、[1]翌日にCVE IDが割り当てられ、[2]日本時間の7月15日に修正された。[3]

仕組み

Scratch 3.0は、読み込む拡張機能を、project.jsonファイルのブロックのオペコードを用いて判断している。これはgetExtensionIdForOpcodeという関数にて行われている。この関数では以下のことを行っていた:

  • オペコードをアンダーバー(_)で区切って、最初の部分を拡張機能IDとする。
  • 拡張機能IDが実際は拡張機能ではない種類であった場合は、空白を返す。
  • その場合は、拡張機能IDを返す。

例えば、答えブロックのオペコードはsensing_answerで、拡張機能IDはsensingであるが、sensingはブロックの種類の中の調べるブロックにあたるため、空白が返る。全部消すブロックpen_clearのため、拡張機能IDpenが返る。

存在しないオペコードhttps://example.com/test.js_fooがこの関数に渡されたとしても、返り値は上のルールに従ってhttps://example.com/test.jsとなる。

返された拡張機能IDは、拡張機能をIDまたはURLから読み込む関数、loadExtensionURLに渡される。もし拡張機能IDが存在する拡張機能を意味している場合は、その拡張機能が読み込まれるが、それ以外の場合は拡張機能は渡された拡張機能IDをURLとして解釈して読み込まれる。

ただし、URLから読み込まれた拡張機能はWeb Workerで実行される。このため、実際に悪用されたとしても、重大な被害は及ばない。

出典

  1. 発見者の投稿
  2. https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-14000
  3. https://github.com/LLK/scratch-vm/pull/2476