
CVE-2026-33317の概念実証。OP-TEE PKCS#11 TAにおける領域外書き込みであり、不正な属性テンプレートを介したセキュアワールドのヒープ破壊を実証します。
このリポジトリには、CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9 に関するNormal Worldの概念実証(PoC)、再現手順、および取得したログが含まれています。
公式のOP-TEEアドバイザリでは、PKCS11_CMD_GET_ATTRIBUTE_VALUE に対する entry_get_attribute_value() における検証欠落が説明されています。このバグにより、PKCS#11 TAヒープからの範囲外読み取りが発生し、不正な属性テンプレートを使用すると、一時テンプレートバッファを超えた書き込みが発生する可能性があります。このPoCは範囲外書き込みのケースを対象としており、PKCS#11 TAにおけるSecure Worldヒープ破壊を実証します。
CVE-2026-33317>= 3.13.04.11 以降8.7 HighCWE-125, CWE-787これは、OP-TEEのテストが許可されているローカルラボまたはその他の環境でのみ使用してください。
このREADMEが作成されたローカル作業コピーは、フラット化されたOP-TEE QEMUv8ワークスペースでした。.repo ディレクトリとすべての .git メタデータファイル/ディレクトリは削除されているため、このローカルアーカイブは repo sync や通常のgit履歴コマンドでは使用できなくなりました。
GitHubリポジトリには、容量の大きいOP-TEE/QEMUソースツリー、ツールチェーン、ビルド出力は意図的に含まれていません。これらは qemu-v8-setup.md から再作成するか、PoCファイルを既存のOP-TEE qemu_v8 ビルドルートにコピーしてから、新しいクローンから自動化されたQEMU再現を実行してください。
重要なトップレベルファイル:
準備されたローカルアーカイブには、optee_os、optee_client、qemu、linux、trusted-firmware-a、u-boot、buildroot、out-br、toolchains などのソース/ビルドディレクトリもありましたが、これらは公開用に無視されています。
脆弱な optee_os ツリーでは、ta/pkcs11/src/object.c がクライアント提供のシリアライズされた属性テンプレートを反復処理します:
cur = (char *)template + sizeof(struct pkcs11_object_head);
end = cur + template->attrs_size;
...
data_ptr = cli_head.size ? cli_ref->data : NULL;
rc = get_attribute(obj->attributes, cli_head.id, data_ptr, &cli_head.size);
このループは、各属性ヘッダーとそのデータ領域が割り当てられたテンプレート内に完全に収まっていることを証明していません。PoCは以下を送信します:
attrs_size = 8、正確に1つの pkcs11_attribute_head でデータバイトなし。attrs_count = 1。cli_head.id = CKA_LABEL。cli_head.size = 16、作成されたオブジェクトの16バイトのラベルと一致。これにより、16バイトのテンプレート割り当てが作成されます:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
その後、cli_ref->data は template + 16 を指し、割り当ての終端からちょうど1バイト後を指します。ta/pkcs11/src/attributes.c の get_attribute() は、呼び出し元が提供したサイズが十分に大きいことを確認し、16バイトのラベルをその範囲外ポインタにコピーして、PKCS#11 TAヒープを破壊します。
準備されたQEMUv8ワークスペースで使用される前提条件:
expectqemu-v8-setup.md に記載されているローカルアーカイブのように配置された、ビルド出力、ツールチェーン、QEMUバイナリを含むOP-TEE qemu_v8 ワークスペースPoCをビルドします:
./build_poc.sh
期待されるビルド結果:
Built: out/bin/c01_poc
自動化されたQEMUv8再現を実行します:
./run_c01.sh
ラッパーは起動前に以下のステージングファイルをチェックします:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_pocビルド成果物が存在しない場合は、まずOP-TEEワークスペースを再作成/ビルドしてから、./build_poc.sh を再実行してください。
Normal Worldログには、細工されたリクエストが表示されるはずです:
[+] TEEC session with PKCS#11 TA opened
[+] INIT_TOKEN rc=0x00000000 OK
[+] OPEN_SESSION rc=0x00000000, session_handle=0x00000001
[+] CREATE_OBJECT rc=0x00000000, obj_handle=0x00000001
[+] Object has CKA_LABEL = "AAAAAAAAAAAAAAAA" (16 bytes)
[+] Sending malicious C_GetAttributeValue (attrs_size=8, cli_head.size=16)...
[+] GET_ATTRIBUTE_VALUE[0] rc=0xffffffff
Secure Worldログには、アロケータのアサーションとTAパニックが含まれているはずです:
E/TA: assertion 'BH((char *) b - b->bh.bsize)->prevfree == 0' failed at lib/libutils/isoc/bget.c:1022 in brel()
E/TC:? 0 TA panicked with code 0xffff0000
E/LD: Status of TA fd02c9da-306c-48c7-a49c-bbd827ae86ee
成功した実行から取得したログは、すでに以下に存在します:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c は、libteec を通じてPKCS#11 TA UUID fd02c9da-306c-48c7-a49c-bbd827ae86ee を呼び出します:
CKA_LABEL = "AAAAAAAAAAAAAAAA" を持つAESセッションオブジェクトを作成します。attrs_size = 8 と cli_head.size = 16 を持つ不正な CMD_GET_ATTRIBUTE_VALUE リクエストを送信します。最初の悪意のあるリクエストだけで、ヒープメタデータを破壊するのに十分です。その後、OP-TEE bgetアロケータが破損したブロックメタデータを検出すると、TAはパニックします。
run_c01.sh は out/bin をvirtio-9p経由でゲストと共有し、ログを同じディレクトリに書き戻します。out/bin 内のステージングされたブート成果物リンクは、そのアーカイブ内の成果物を指す必要があります。公開されたGitHubリポジトリは、取得した out/bin/c01_*.log ファイルのみを追跡します。C-01-reproduction.md は、以前のx86 ASANハーネスアプローチを文書化しています。このフォルダの実行可能なPoCは、QEMUv8 TEEC PoC: c01_poc.c です。| パス | 目的 |
|---|
c01_poc.c | 生の libteec 呼び出しを使用するAArch64 Normal World PoC |
build_poc.sh | c01_poc.c を out/bin/c01_poc にクロスコンパイルします |
run_c01.sh | QEMUv8を起動し、expect を通じてPoCを実行します |
c01_check.exp | ゲストログイン、virtio-9pマウント、PoC実行を自動化します |
out/bin/c01_nw.log | 取得したNormal World再現ログ |
out/bin/c01_sw.log | PKCS#11 TAパニックを含む取得したSecure Worldログ |
reproduction-log.md | 完全なQEMUv8再現メモ |
qemu-v8-setup.md | OP-TEE QEMUv8セットアップとベースライン検証メモ |
C-01-reproduction.md | 以前のASANハーネスメモ。このフォルダの主要な実行可能PoCではありません |
AGENTS.md | 将来のAI/コードエージェント向けのメンテナンスメモ |