電圧グリッチングを使用してマイニングカードのA100を解放する
Using voltage glitching to unleash the A100 in my mining card (blog.kate.land)
要約
著者は、GA100ダイ上の電圧フォールトインジェクション(VFI)の脆弱性を発見し、任意のヒューズを破壊できるようにしました。これにより、CMP 170HX 8GBカードが実質的にA100-80Gに変換されました。さらに、アンロックされたカードは、NVIDIAが生産A100カード用に選択した108基ではなく、すべての機能的なSMを有効にすることで(ダイのロットによる)、リテールA100よりも約1.2倍高速に動作します。NVLink、PCIe Gen4、NVJPG、NVDEC、MIGなどのCMP無効化機能もアンロック可能ですが、NVJPG/NVDEC/MIGは特にテストされていません。
全文翻訳
マイニングカードのA100を解放するために電圧グリッチングを使用する
要約
GA100ダイ上の電圧フォールトインジェクション(VFI)の脆弱性を発見し、任意のヒューズを破壊できるようにしました。この脆弱性を利用して、私のCMP 170HX 8GBカードを実質的にA100-80Gに変換しました!さらに、アンロックされたカードは、NVIDIAがすべての生産A100カード用に選択した108基ではなく、すべての機能的なSMを有効にすることで(ダイのロットに依存)、リテールA100よりも約1.2倍高速に動作します。さらに、CMPで無効化されていたNVLink、PCIe Gen4、NVJPG、NVDEC、MIGなどの機能も、このアプローチでアンロック可能ですが、NVJPG/NVDEC/MIGは特にテストしていません。
私の「A100-80G」がどのように表示され、機能するかを以下に示します。
GPUインベントリとトポロジー
GPU 0
81920 MiB
NVIDIA Graphics Device
00000000:81:00.0
0x20C210DE
GPU 1
81920 MiB
NVIDIA Graphics Device
00000000:C1:00.0
0x20C210DE
GPU 0
NV12
GPU 1
CPUアフィニティ 0–127 · NUMA 0
完全なnvidia-smi出力
$ nvidia-smi --query-gpu=index,pci.bus_id,pci.device_id,name,memory.total; nvidia-smi topo -m
index, pci.bus_id, pci.device_id, name, memory.total [MiB]
0, 00000000:81:00.0, 0x20C210DE, NVIDIA Graphics Device, 81920 MiB
1, 00000000:C1:00.0, 0x20C210DE, NVIDIA Graphics Device, 81920 MiB
GPU0 GPU1 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NV12 0-127 0 N/A
GPU1 NV12 X 0-127 0 N/A
FP16 FMAスループット
TFLOP/s
リテールA100
1.00×
ハードウェアアンロックCMP 170HX
1.18× リテールA100
リテールA100 72.488 TFLOP/s; ハードウェアアンロックCMP 170HX 85.858 TFLOP/s(以下の生のOpenCL出力より)。
完全なOpenCL出力
.-----------------------------------------------------------------------------
|----------------.------------------------------------------------------------|
| Device ID 0 | NVIDIA Graphics Device |
| Device ID 1 | NVIDIA Graphics Device |
|----------------'------------------------------------------------------------|
|----------------.------------------------------------------------------------|
| Device ID | 0 |
| Device Name | NVIDIA Graphics Device |
| Device Vendor | NVIDIA Corporation |
| Device Driver | 610.43.03 (Linux) |
| OpenCL Version | OpenCL C 3.0 |
| Compute Units | 124 at 1410 MHz (7936 cores, 22.380 TFLOPs/s) |
| Memory, Cache | 81338 MB VRAM, 3472 KB global / 48 KB local |
| Buffer Limits | 20334 MB global, 64 KB constant |
| Max Workgroup | 1024 threads |
|----------------'------------------------------------------------------------|
| Info: OpenCL C code successfully compiled. |
| FP64 Compute (double, fma ) 11.287 TFLOPs/s (1/2 ) |
| FP32 Compute (float , fma ) 22.781 TFLOPs/s ( 1x ) |
| FP16 Compute (half2 , fma ) 85.858 TFLOPs/s ( 4x ) |
| INT64 Compute (long , a*b+c) 2.759 TIOPs/s (1/8 ) |
| INT32 Compute (int , a*b+c) 22.769 TIOPs/s ( 1x ) |
| INT16 Compute (short2, a*b+c) 20.273 TIOPs/s ( 1x ) |
| INT8 Compute (char4 , dp4a ) 81.169 TIOPs/s ( 4x ) |
| Memory Bandwidth ( coalesced read ) 1883.17 GB/s |
| Memory Bandwidth ( coalesced write) 2137.93 GB/s |
| Memory Bandwidth (misaligned read ) 1460.81 GB/s |
| Memory Bandwidth (misaligned write) 250.13 GB/s |
| PCIe Bandwidth (send ) 13.10 GB/s |
| PCIe Bandwidth ( receive ) 11.69 GB/s |
| PCIe Bandwidth ( bidirectional) (Gen3 x16) 11.58 GB/s |
|-----------------------------------------------------------------------------|
'-----------------------------------------------------------------------------'
NVIDIAは、製品セグメンテーション、セキュリティ機能、その他の楽しいアクセス制御機能のためにヒューズを使用しています。そして重要なことに、ヒューズを破壊することで、アクセスが少なくなるのではなく、多くなるいくつかの機能があります。適切に保護された設計では、破壊されたヒューズは常に、経済的に実行可能な方法でヒューズを元に戻すことができないため、より制限的な状態を誘発するはずです。NVIDIAの設計では、より多くのヒューズを破壊することで制限を緩和できます!
この投稿では、GA100ダイ、そのヒューズコントローラー、VFIの使用、および将来の研究の方向性について説明します。私の研究を可能にした作業の一部をここに公開することにしました。
謝辞
私の仕事は、Jon Pryによる以前の研究と、GA100ダイをより深く理解するために多くの時間を費やした他の多くの人々の業績に基づいています。私は、別のセキュリティ研究者が独立して同じ脆弱性を発見した後に私の発見を開示しています。この情報を一般に公開することが、公共の利益に最も資すると信じています。これらの発見は、この記事の公開に先立ってNVIDIAの製品セキュリティチームに開示されました。
GA100のバージョン
GA100は、ほぼ20種類のSKUを搭載するために使用されてきたNVIDIAのダイです。A100が最もよく知られたバリアントです。すべてのSKUに深く立ち入るつもりはありませんがhttps://www.techpowerup.com/gpu-specs/nvidia-ga100.g931、私の作業にとって重要なGA100の現れを提示します。CMP 170HXとA100のさまざまなバージョンをカバーします。
製造されたGA100ダイには128個のSM、12個のFBP、5個のNVDECユニット、PCIe Gen4 x16コントローラーがあり、フレームバッファサイズに応じて、ダイと共同パッケージ化された4〜6スタックのHBMが付属しています。NVIDIAは、歩留まり制御と製品セグメンテーションのためにeFuseを使用しています。未分化のGA100は、欠陥テストと製造業者の需要に基づいて、より制限的なバリアントになります。
製品セグメンテーションの最も極端な現れの一つであるEthereumマイニングカードであるCMP 170HXは、名目上8GBまたは10GBのアプリケーション露出フレームバッファ容量を持っていますが、実際にはそれぞれ約80GBおよび約40GBのHBMを搭載しています!この作業は主に、その容量を完全にアンロックして使用する方法を中心に展開しています。以前の研究は、ソフトウェアメソッドを通じてGA100のアンロックにおいて大きな進歩を遂げました。VFIは私たちを最後の仕上げに連れて行きます。
| SKU |
| --- | Out-of-box |
| Software (cmpunlocker) |
| GA100VFI |
| CMP 170HX 8GB |
| |
| |
| |
| Framebuffer |
| 8 GB |
| 64 GB |
| 64-80 GB1 |
| CMP 170HX 10GB |
| |
| |
| |
| Framebuffer |
| 10 GB |
| 40 GB2 |
| 40-48 GB |
| Both CMPs |
| |
| |
| |
| SMs |
| 70 |
| 70 |
| 120-128 |
| PCIe generation |
| 1 |
| 2 |
| 4 |
| NVLink |
| No |
| No |
| Yes3 |
| ECC |
| No |
| No |
| Yes4 |
| Multi-Instance GPUs |
| No |
| No |
| Yes4 |
| NVDEC |
| 0 |
| 0 |
| 54 |
ハードウェア制限
では、NVIDIAはどのようにヒューズを使用して、1つのダイからデータセンターA100とマイニングCMPカードの両方を製造するのでしょうか?これを理解するには、GA100にあるヒューズコントローラーを詳しく調べる必要があります。
ヒューズコントローラーは、16,384個のeFuse(512行x 32列)と、その生のヒューズマクロを取り囲む多くのロジックを含むブロックです。そのジョブは、ヒューズの読み取りとプログラミングを実行し、基盤となるヒューズを保護し、ダイの残りの部分に利用可能な「オプションワード」を提供することです。これらのオプションワードは、 subsequently ダイがどのように機能し、どの機能が有効になるかを決定します。
各eFuseは2つの状態(破壊=1、未破壊=0)のいずれかであり、512行は4つの領域に分割されています。
- 通常のヒューズ(行0-221)。これらは簡単です。多くの場合、単一(ペアの)ヒューズがオプションワードにマッピングされます。例えば、OPT_ENABLE_FUSE_PROGRAM(さらにヒューズプログラミングが許可されるかどうかを決定するオプションワード)などです。通常のヒューズには組み込みの冗長性があります。例えば、OPT_ENABLE_FUSE_PROGRAMはPRIとRED(プライマリと冗長)ヒューズで構成されており、この場合、プライマリインスタンスは行0のヒューズ0、冗長は行1のヒューズ0です。一部のオプションワードはスカラーであり、例えばOPT_X_COORDINATEは9ビット幅で、製造されたウェハー上のダイのx座標を保持しているとされています。重要なのは、通常のヒューズが破壊された場合、それを元に戻すための実質的な手段がないことです(RIRまで)。
- フューセレスヒューズ(行222-487)。これは奇妙なものです。明らかにNVIDIAは、通常のヒューズを誤って破壊してエンジニアリングサンプルを台無しにすることにうんざりし、JTAGチェーン形式で効果的なオプションワードをエンコードするシステムを考案しました(この特許を参照)。FFを、どのオプションワードがどの値を持つべきかを記述するスクリプトと考えることができます。FFヒューズ(RAS症候群でご容赦ください)は、VFIを使用してアンロックできる機能のほとんどに関係しています。これは、FFオプションワードが新しいFF行を書き込むだけで簡単にクリアできるためです!これについては後で詳しく説明します。今のところ、NVIDIAもこれを認識していることを知っておくべきです。なぜなら、通常の条件下では、FFヒューズの破壊を実行することは厳しく禁止されているからです。
- IFFヒューズ(行487-512)。これらは、FFとは異なる形式の命令を含んでいます。これらはこの投稿の範囲外であり、ヒューズコントローラーのオプションワードをオンザフライで再プログラムするのに主に役立ちます。通常、生産カードではアクセスできません。
- RIRヒューズ(32個のヒューズの8行。技術的には512行の一部ではありません)。これらはヒューズマクロの設計者(TSMCデータシートこちら)によって提供され、本質的にヒューズマクロの設計者が意図した「ヒューズ修復」メカニズムです。GA100のRIRセクションには、16個の修復命令用のスペースがあり、それぞれがメインの512行の単一ヒューズの値を上書きします。残念ながら、特に8GB 170HX SKUでは、16個のRIRワードのうち15個はすべて1であり、16番目のワードは、興味深いアンロックにほとんど利用できない無用な修復命令をエンコードしています。10GB SKUでは話は異なりますが、それは別の日の問題です…
VFIベースのアンロックにとって特に興味深い2つのヒューズグループがあります。
- 「制御ヒューズ」。この用語は、NVIDIAのTegraハードウェアヘッダーから来ており、行0と行1の値を指定する、非常にセキュリティが重要なオプションワードに特に関連しています。
- フューセレスヒューズ。これは、GA100が単なるマイニングカードではなくAIデータセンターのワークホースとして生まれるかを決定する、すべての興味深いオプションワードをエンコードします。
FFエンコードされたオプションワードの名前をいくつか挙げる前に、FFレコード形式をもう少し詳しく理解し、次に興味のある機能を制御するダイブロックについて話す必要があります。
フューセレスヒューズ
各FF行は32ビットレコードです。ビット0〜4はチェーンを選択し、ビット5はFFとIFFを区別します(FFの場合は0)、ビット6〜15は16ビットブロックを選択し、ビット16〜31はそのブロックの新しい値を供給します。特許のJTAGチェーンの図は文字通りです。コントローラーは、これらのレコードをチェーンに再生することでオプションデータを構築します。各チェーンの固定位置は個々のオプションワードに対応します。
2つのレコードが同じチェーンとブロックをアドレスする場合、後のレコードが優先されます。たとえば、0x0fe805c1はチェーン1、ブロック23、データ0x0fe8を意味します。そのレコードを追加すると、以前のFFレコードによって設定された効果的なビットをクリアできます。物理的なヒューズは破壊されません。新しい行が古い16ビットブロックに置き換わります。これはFFバックアップオプションでは機能しますが、行0と行1の通常の制御ヒューズでは機能しません。
FFワードがどのようにエンコードされるかを知ったので、興味深いワードとその場所のリストを以下に示します。これらは、公式のマッピングが知られていないため、異なるGA100 SKUのFF値と効果的なオプションワードを比較してFFチェーン/ブロックからオプションワードへのマッピングを差分的に理解するのに役立った、非常に役立つ研究者によって発見されました。
| 名前付きオプション |
| --- | 推測されるFF位置 |
| Use |
| NV_FUSE_OPT_FBIO_DISABLE |
| Chain 1 bits 83–106; blocks 5–6 |
| Memory I/O floorsweep |
| NV_FUSE_OPT_FBPA_DISABLE |
| Chain 1 bits 107–130; blocks 6–8 |
| Memory subpartition floorsweep |
| NV_FUSE_OPT_GPC_DISABLE |
| Chain 1 bits 131–138; block 8 |
| GPC floorsweep |
| NV_FUSE_OPT_TPC_GPC0_DISABLE through NV_FUSE_OPT_TPC_GPC7_DISABLE |
| Chain 1 bits 187+8i through 194+8i for GPC i; blocks 11–15 |
| Eight TPC masks |
| NV_FUSE_OPT_PES_DISABLE |
| Chain 1 bits 251–274; blocks 15–17 |
| PES floorsweep |
| NV_FUSE_OPT_FBP_DISABLE |
| Chain 1 bits 307–318; block 19 |
| Framebuffer partition floorsweep |
| NV_FUSE_OPT_ROP_L2_DISABLE |
| Chain 1 bits 319–342; blocks 19–21 |
| ROP/L2 floorsweep |
| NV_FUSE_OPT_NVLINK_DISABLE |
| Chain 1 bits 368–370; block 23 |
| NVLink disable mask |
| NV_FUSE_OPT_DISABLE_GEN3_SPEED |
| Chain 2 block 39; which of bits 1 and 9 is unresolved |
| PCIe Gen3 speed restriction |
| NV_FUSE_OPT_PCIE_MAGIC_BITS_D[25] |
| Chain 2 block 47 bit 3 |
| Gen4 speed-disable flag |
| NV_FUSE_OPT_PCIE_BOOT_GEN23_DISABLE |
| Chain 2 block 49 bit 6 |
| PCIe boot policy |
| NV_FUSE_OPT_PCIE_BOOT_GEN3_DISABLE |
| Chain 2 block 49 bit 7 |
| PCIe boot policy |
| NV_FUSE_OPT_PCIE_DEVIDA |
| Chain 2, bits 593–608; blocks 37–38 |
| Device identity |
| NV_FUSE_OPT_PCIE_DEVIDB |
| Chain 2, bits 609–624; blocks 38–39 |
| Device identity |
| NV_FUSE_OPT_SYS_PIPE_DISABLE |
| Chain 1, bits 372–379; block 23 |
| Multi-instance GPU enabled pipes |
FBIO/FBPA/FBP/TPC/GPC/PES/ROPの略語はすべてマイクロアーキテクチャ要素を参照しています。これらの要素が互いにどのように関連しているかをさらに理解するために、GA100ホワイトペーパーのこの図を参照してください。
[画像: GA100ホワイトペーパーからのGA100ダイブロック図]
FBPは「フレームバッファパーティション」の内部NVIDIA用語で、2つのFBPが1つのHBMスタックに対応します。FBPAはサブパーティションで、1つのFBPに2つのFBPAがあります。PES/ROPは、SMが機能するために必要なブロック(グラフィックス関連と思われる)です。
この知識があれば、もし私たちが_DISABLEワードをすべてゼロ、または少なくともダイの欠陥を考慮して可能な限り寛容に設定する新しいFF行を書き込むことができたとしたらどうでしょうか?_DISABLEオプションがどのように他の要素と組み合わせて使用されるかを見ると、これらの_DISABLEワードが、ダイの一部を「フロアスイープ」されないようにするための主要なレバーであることがすぐにわかります。この「もしも」を明らかにした後、「どのように」について話します。つまり、電圧フォールトインジェクションの正確な適用方法と、VFIで回避できるヒューズコントローラーの保護機能についてです。
フロアスイープ
NVIDIAはこれらのオプションをフロアスイープ信号の設定に責任を持たせており、これによりダイ要素が到達不能(おそらく電源オフ)になります。実験から、フロアスイープラインはRTLで指定されており、ヒューズコントローラーから個々の機能ブロックに発信され、ブロック内のマスター電源/クロックドメインスイッチを制御していると信じています。フロアスイープの動作が、各機能ブロックのステータスワードの値と非常に短い遅延で対応することを確認しました。
たとえば、FBPフロアスイープを見てみましょう。私の8GBカードの1枚では、OPT_FBP_DISABLEは0x852でした。FBP 1、4、6、11がマスクされていました。個別のOPT_FBP_DEFECTIVEマスクは0x840で、6と11をカバーしていました。FFバックアップ無効化マスクを0x840に減らす置換FF行で、1と4に対する追加マスクはなくなりましたが、欠陥のある6と11は無効のままでした。これにより、ダイの12個のFBPのうち10個が効果的なマスクに残ります。機能的には、OPT_FBP_DISABLEが0x852だったときに読み書きを拒否したFBP 1と4は、このヒューズ書き込み後に応答可能になりました。
機能ブロックはFF書き込みで「フロアスイープ解除」できますが、これによりブロックがエンドアプリケーションで完全に利用可能になるわけではありません。たとえば、デフォルトのフレームバッファジオメトリ構成は、利用可能な各HBMスタックの一部しか使用しません。
それを回避するために、cmpunlockerの方法の小さな変更を実質的に利用できます。通常の8GBから64GBへのアンロックのドライバパッチは、一連の機能構成ワード(FBPA_CFG、SM_SPEED_SELECTなど)に書き込みます。デフォルト値は、170HXの一般的なバリアントが、特定の機能ブロックの使用を妨げる_DISABLE FF由来のオプションワードを持っているため、成功するように選択されています(それらを使用しようとすると、フロアスイープエラーが返されます)。アンロックFFの書き込みが完了すると、さらに寛容なワードを構成レジスタに書き込むことができ、機能的にはA100-80Gになります。
FF書き込みの達成
情報があれば、任意のFFヒューズを破壊できれば、歩留まりと搭載されたメモリスタックによって決定されるGA100の最大能力まで完全にアンロックできると単純に思えます。しかし、FFヒューズをどのように破壊するのでしょうか?ヒューズコントローラーのヒューズプログラミング機能を見て、さらに理解しましょう。
ヒューズの破壊を要求するには、ヒューズコントローラーに属するFUSEADDR、FUSEWDATA、およびFUSECTRLレジスタに書き込む必要があります。ホストや特権のない要求者には名目上アクセスできませんが、Canary in the Crypto Mine ROPを使用すると、責任ある特権レベルマスクを開くことは簡単です。そのため、多くの研究者がヒューズコントローラーにFF領域のヒューズを破壊するように強制しようとしました。私たちの共有された観察結果のいくつかを以下に示します。
- ヒューズコントローラーには内部FSMがあり、FUSECTRL_STATEビットを介して現在の状態を示します。
- ヒューズコントローラーは、要求されたFUSEWDATA値の各「ホット」ビットごとにWRITE_PROGRAM状態に入ります。これは、期待されるヒューズプログラミング動作と一致します。
- しかし、特定のオプションワードがクリアされない限り、FPF範囲(行96-221)外のヒューズアドレスへの書き込みは実際には行われません。この領域のヒューズ(フィールド関連情報とともに、どのマイクロコードバージョンが実行されたかのウォーターマークを示す「フィールドプログラマブルヒューズ」であると考えられています)は効果を発揮し、ヒューズコントローラーの状態機械はFPF領域と非FPF領域の間で同様に動作します。
私が言及している特定のオプションワードはOPT_SECURED_BURN_FEATURE_ENABLE(「SBFE」)であり、すべての生産カードで1に設定されています。このオプションワードがクリアされると、任意の場所でのヒューズプログラミングが許可されます。設定されている場合、FPFヒューズのみを破壊できます。現在まで、SBFE=1でFFヒューズを破壊する方法は見つかっていません。ヒューズコントローラーをHSコンテキストから操作している場合でも同様です。「セキュアバーン」が実際に何を意味するのかは明確ではありません。SBFE=1であっても、ソフトウェアのみで非FPFバーンを実行する方法があるはずだと推測していますが、「セキュア」という形容詞が実際に何を意味するのかはまだわかっていません。
注意 PLM、HS、ucode…; 説明が深くなるにつれて、NVIDIA固有の用語を多く使用しています。これらの用語の意味について非常に詳細な説明が必要な場合は、Je Ne Sais Quoi - Falcons over the Horizonなどの他のソースを参照してください。
重要なのは、より寛容なカードで人々が理解しているように、SBFE=0でFFバーンを実行できることです!そして、この状態を達成することがGA100アンロックを達成する方法であることが判明しました。多くの試行錯誤の後、電圧フォールトインジェクションによってこの状態を誘発することに頼り、それを達成することができました。電圧グリッチングについてもう少し話しましょう。
電圧フォールトインジェクション
VFIについては多くのことが言われていますが、詳細な説明は他のソースに任せます。要するに、短い低電圧パルスを印加すると、集積回路で予期しない動作が発生することがよくあります。GPT-6 Astraに、CMP PCB上のPWMVID信号に接続するSTM32G4ベースのボードを設計するように依頼しました。PWMVIDは電圧レギュレーターのNVIDIA標準であり、私のグリッチャーはGA100ダイから放出されるPWM信号をインターセプトし、MP2888B VRMドライバーICに供給される独自の波形に置き換えます。私のセットアップでは、カード自身のVRMにタイミンググリッチを生成させることができます。これはMOSFETベースのセットアップよりもシンプルで、PMBusを直接駆動しようとするよりも高速なグリッチングを可能にします。
グリッチャーはPCBに2つの接続が必要です。理想的には磁石線/エナメル線で行います。1本の線はNVVDDに接続して電圧を検出し、もう1本の線はPWMVID信号に接続します。必要な唯一の追加ステップは、0402 0オーム抵抗の除去です。これにより、GA100出力PWMピンとVRM IC間の接続が切断されます。タップの場所を見つけることは、MP2888Bのピン配置、特にPWMVIDピンとVOSENピンをトレースすることで簡単です(MP2888Bは、その兄弟である公開チップMP2888Aと同じフットプリントを共有しています)。MP2888Bのすぐ隣にあるテストポイントにより、PWMVIDタップの取り付けが比較的容易になります。
このタップを設置すると、1回のグリッチ試行は次のシーケンスで構成されます。
- カードの電源を切る
- カードの電源を入れる
- NVVDDがしきい値を超えたらすぐにタイマー(「グリッチタイマー」)を開始する
- グリッチタイマーに合わせたPWMVID信号を発行して、提案された電圧波形を実行する
- カードの動作を観察し、必要に応じてステップ1から繰り返す
私のセットアップは、ACPI S0 -> S3 -> S0遷移でステップ1/2を達成します。これは、最新のデスクトッププラットフォームでは数秒で実行できます。より侵襲的な変更や高価なリグは、おそらくより良い実験レートを達成できるでしょうが、私の経験では、このセットアップは、後述のアプローチを使用して、グリッチング時間の1時間から48時間以内にカードをアンロックするのに十分です。
Astraが作成したファームウェアは、STM32コンパレーターを使用してNVVDDが225mVを超えたことを検出し、その後、タイトなDMAループがPWMVIDピンで目的のデューティサイクルを駆動します。S0の後、ホストはカードの状態を検査し、次に何をすべきかを決定します。別のグリッチが必要な場合、グリッチャーボードはUSB経由でグリッチパターンとともにコマンドを受け取ります。その後、ホストはRTCタイマーを使用してS3に入り、約3秒後に再起動します(経験的に導出された期間で、良好な安定性を確保)。
ホストがS0に戻れない場合があります。これは、グリッチキャンペーンのブックキーピングと準備をSBC(Radxa Cubie A5E)に委任することで解決しました。SBCは、グリッチターゲットホストが応答しない場合にGPIO経由でマザーボードの電源/リセットボタンピンを駆動することもできます。
詳細については、GA100VFIリポジトリで確認できます。今のところ、VFIを通じてトリガーできるさまざまな興味深い状態、およびFF行を破壊するために必要な特定のグリッチ状態を見てみましょう。各グリッチ状態の違いを明確にするために、電圧印加時にヒューズコントローラーがどのように起動するかについての経験的モデルを構築しました。ヒューズコントローラーを実装するRTLがないため、すべて推測であることに注意してください。以下は仮説的なブートステージです。
- ヒューズマクロの要件に従ってRIRを検出する
- 制御行を検出する(ヒューズマクロから読み取りレジスタへ)
- 制御行を制御行由来のオプションワードにラッチする
- 残りの行を検出する
- 通常のヒューズ値をオプションワードにラッチする
- FFチェーンを解析する
- FFチェーン値をオプションワードにラッチする
これらの仮説的なステージは、私がダイから実際に読み取れるものに基づいています。コントローラーの状態、CMD_READが機能する場合の生の行、公開されているオプションワード、およびPRIリングがGPUの残りの部分に到達できるかどうかです。いくつかの重要な値を見ることで、グリッチの結果を区別できます。重要なのは、グリッチパターンと結果はダイ固有であることが多いため、これらの例の波形と応答はあくまで例として考えるべきです。3つの興味深いグリッチ状態を見てみましょう。
1. すべてのヒューズがゼロとして検出される
コマンドPWMVIDデューティ · 59.58% / 0.8333%
期待されるNVVDD · シミュレート
発行されたデューティとモデル化されたNVVDD
オレンジの系列は、t=0でのMCU ADCのNVVDD 225mVブートトリガー後のコマンドPWMVIDデューティ、その後200〜1015msの大きなギャップです。パルス間隔:210.000〜1010.000 ms。ティール系列はシミュレートされたNVVDDで、225mVまでのモデル化されたブートライズと、コマンドパルスへのスルーレート制限応答です。これは同じ実行の電圧キャプチャではありません。この試行では、668/672のオプション読み取りがゼロでした。セクションの669/672の例は別のキャプチャです。
t=0
NVVDD ≥225 mV
MCU ADCトリガー
パルス1:210.000–1010.000 ms、800 ms持続時間
900 mV
297.8 mV
ms後 t=0; 左側のギャップは0〜200 msを省略
ほとんどすべての公開されたオプションワードがゼロとして読み取られるようにするグリッチがあります。1つのキャプチャされた状態では、672個中669個の名前付きオプション読み取りがゼロでした。他の3つはエラー応答でした。コントローラーのCRCステータスは0x00(まだ解析されていません)で、PCIe IDは2080(ベースGA100 PCIe製品ID、実際の小売製品に対応しない)と読み取られ、GPUのPRIリングはリセット状態で保持されていました。
この状態は、ヒューズコントローラーの壊滅的な障害と一致します。ほとんどすべてのブート機能がゼロ状態によって妨げられるため、カードは基本的に使用不能になります。しかし、興味深いことに、カードはネイティブでPCIe Gen4でトレーニングされます!わずかに変更されたバリアントは、ヒューズの一部が正常にラッチされた状態、またはゼロではなく破損した値を含む状態を示す場合があります。これらの状態のいずれかをFFバーンに向かって推進することはできませんでした。ほとんどすべての場合、ヒューズコントローラーは到達不能または機能不全です。
2. RIR読み取りが中断される
コマンドPWMVIDデューティ · 59.58% / 0.8333%
期待されるNVVDD · シミュレート
発行されたデューティとモデル化されたNVVDD
オレンジの系列は、t=0でのMCU ADCのNVVDD 225mVブートトリガー後のコマンドPWMVIDデューティ、その後977〜1008msの大きなギャップです。パルス間隔:980.000〜1005.000 ms。ティール系列はシミュレートされたNVVDDで、225mVまでのモデル化されたブートライズと、コマンドパルスへのスルーレート制限応答です。これは同じ実行の電圧キャプチャではありません。行18のみの読み取りバックが2回目のブートで再発しました。RIRの関与は仮説です。
t=0
NVVDD ≥225 mV
MCU ADCトリガー
パルス1:980.000–1005.000 ms、25 ms持続時間
900 mV
297.8 mV
ms後 t=0; 左側のギャップは0〜977 msを省略
CMP 170HX 8GBでのRIRデータの読み取りは、その正確な効果を示しています。15個のノーオペレーション修復命令と、行18のヒューズ値を変更する1つの書き込みです。このオプションワードは監視できます。さらに、RIR検出はヒューズコントローラー自体ではなく、ヒューズマクロによって内部的に消費されるため、生の行を読み取ろうとすることで中断されたRIRラッチを観察できます。ビットフリップは、フリップされたオプションワードと生のヒューズ行の両方で一貫しています。これは、ダイブートを調査する上で興味深い時間的チェックポイントを設定しますが、それ自体は有用なグリッチではありません。
3. ゴルディロックスのグリッチ
コマンドPWMVIDデューティ · 59.58% / 0.8333%
期待されるNVVDD · シミュレート
発行されたデューティとモデル化されたNVVDD
オレンジの系列は、t=0でのMCU ADCのNVVDD 225mVブートトリガー後のコマンドPWMVIDデューティ、その後978〜992msの大きなギャップです。パルス間隔:979.940〜981.940 ms、983.940〜985.940 ms、987.940〜989.940 ms。ティール系列はシミュレートされたNVVDDで、225mVまでのモデル化されたブートライズと、コマンドパルスへのスルーレート制限応答です。これは同じ実行の電圧キャプチャではありません。
t=0
NVVDD ≥225 mV
MCU ADCトリガー
パルス1:979.940–981.940 ms、2 ms持続時間
パルス2:983.940–985.940 ms、2 ms持続時間
パルス3:987.940–989.940 ms、2 ms持続時間
900 mV
297.8 mV
ms後 t=0; 左側のギャップは0〜978 msを省略
私の最初のカードでの成功した3パルス状態は、他のヒューズとオプションワードをそのままにして、行0/1ベースのオプションワードを正確に中断したように見えました。この状態では、行0/1由来のすべてのオプションワードはゼロです。最初の読み取りバックは次のようになります。
| Signal |
| --- | 初期読み取りバック |
| PCI ID and access |
| 20c2; BAR0 and the PRI ring respond |
| FUSECTRL |
| 0xe0040000 (IDLE) |
| CRC_STATUS |
| 0x55 (both halves parsed without errors) |
| DISABLE_SW_OVERRIDE |
| 0 |
| OPT_SECURED_BURN_FEATURE_ENABLE |
| 0 |
| ENABLE_FUSE_PROGRAM |
| 0 |
| FUSECTRL/FUSEOPT privilege masks |
| 0xffffffff for both |
| Raw rows 0 and 1 |
| Both still 0x53557c3d, unchanged from before the glitch |
この段階では、ENABLE_FUSE_PROGRAM=0のため、まだFF書き込みを発行できません。ENABLE_FUSE_PROGRAMがなぜゼロになるのか正直わかりません。リテールボードでは1なので、これはグリッチ検出カナリアを実装する方法のように見えます(またはエレガントにそうするでしょう)。
ヒューズ検出は一度に1行ずつ行われ、すべての32個のヒューズが1本の線で検出のために電源投入されるため、攻撃者が単一のヒューズをクリアまたはセットとして表示させることははるかに困難です。したがって、セキュリティクリティカルな機能(ヒューズバーニングなど)をクリアしたときに無効にする「カナリア」ヒューズを含めるのは理にかなっています。なぜなら、通常、攻撃者はせいぜい行の粒度でしかヒューズ検出を操作できないからです。したがって、行0/1オプションワードがすべてクリアされたと読み取られると、ENABLE_FUSE_PROGRAM=0は、どのヒューズも破壊するのを妨げます。
しかし、この状態にあるものを見てください。DISABLE_SW_OVERRIDE=0です。これは通常1であり、EN_SW_OVERRIDEレジスタを1に設定するのを妨げます。これにより、ヒューズコントローラーによって公開されるほとんどのオプションワードを「シャドウ」できます。これには、オプションワードOPT_に対応するレジスタCTRL_OPT_に書き込むことが含まれます。これにより、効果的な値STATUS_OPT_*が決まります。これがSBFEを0にシャドウすることを可能にするものです。しかし、DSOV=0であっても、ENABLE_FUSE_PROGRAMは、DSOV=0であってもシャドウ不可能なオプションワードの1つであることが判明しました。したがって、行き詰まったようです。
少なくとも私はそう思っていましたが、この状態でしばらく頭を壁に打ち付けました。それから、試したことのない1つのヒューズコントローラーコマンドがあることに気づきました。SENSE_CTRLです。これは、表面的には行0/1(制御ヒューズ)由来のすべてのオプションワードがヒューズ値と一致するように見えるため、SBFEをリセットし、ソフトウェアオプションワードのシャドウイングをオフにし、ヒューズをかけられない状態にするように見えるため、発行を控えていました。驚いたことに、このコマンドを発行すると、DISABLE_SW_OVERRIDEを除くすべての制御ヒューズ由来のオプションがヒューズ値に設定されましたが、DSOVは0のままでした!
DSOV=0で、SBFEを簡単に0に設定できます。ENABLE_FUSE_PROGRAMは、ヒューズ値と一致するため1であり、レースの準備ができています!1つのしわは、FUSEWDATAがロックダウンされたPLMを持つ可能性があることですが、DSOV=0では、OPT_SECURE_FUSE_WDATA_WR_SECUREに0を書き込むだけでPLMをすべて1に設定でき、ヒューズをかけるためのホストアクセスを開きます。
この時点で、残っているのは、興味のある機能の_DEFECTIVE値に一致する_DISABLEワードを計算し、FFバーンを発行することだけです。占有されているFFスペースと欠陥ビットはダイごとに異なるため、各バーンはダイに合わせて調整する必要があることに注意してください。
最終結果
フレームバッファアンロック
8GBカードで80GBがそのまま(私の限定的なサンプルサイズでは約90%の8GBカードのようです)の場合、アンロックによりフル80GBが利用可能なフレームバッファとして得られます。複数の合成テスト(フレームバッファ全体に疑似乱数ワードを書き込み、L2無効化後に読み戻す)および実際のワークロード(vLLMやSGLandなど)はすべて正常に機能します。前述のように、私のカードの1枚は64GBしか使用できません。この場合、ハードウェアアンロックはフレームバッファの利点をもたらしません。
コンピューティングアンロック
170HXは、標準で70個のSMに制限されています。実際には、ダイ上に120基以上のSMが欠陥なく存在することがほとんどであり、アンロックによりそれらすべてを使用できるようになります。これにより、ソフトウェアのみの170HXアンロックと比較して約1.7倍、リテールA100よりも印象的な約1.2倍のパフォーマンス向上が得られます!
FP16 FMAスループット TFLOP/s
ソフトウェアアンロックCMP 170HX
0.69× リテールA100
リテールA100
1.00×
ハードウェアアンロックCMP 170HX
1.18× リテールA100
ProjectPhysX OpenCL-Benchmark FP16 half2 FMA:ソフトウェアアンロックCMP 170HX、50.129 TFLOP/s;リテールA100、72.488 TFLOP/s;ハードウェアアンロックCMP 170HX、85.861 TFLOP/s。リテールA100は1.00倍を基準とします。
PCIe世代
cmpunlockerがPCIe Gen2を超えて進むのを妨げている唯一のことは、FFオプションワードです。関連するビットをクリアすると、Gen3/4はトレーニングされ、完全に機能することが確認されています。PCIeデカップリングコンデンサモッドと組み合わせると、最大PCIe Gen4 x16が可能になり、リテールA100 PCIeバリアントに匹敵します。
NVLink
OPT_NVLINK_DISABLEワードをゼロにするだけでは、NVLinkが実際に機能するために必要なすべての変更ではありません。CMP 170HX PCBにはU11 IC(PCIe 3.3vをNVLinkブリッジピンに接続する)が欠けているため、標準ボードでは接続されたNVLinkブリッジの基準クロックジェネレーターが起動しません。U11のフットプリントの2つのピンをブリッジするだけでこの問題は解決しますが、U11が一部のGPUで未搭載の場合、U11が提供していた規制または保護は失われます!ペアのボードの1つにU11をブリッジしたままにすると、+3.3Vレールが接続されるため、異なる電源で供給されるGPUをブリッジする場合は注意してください!NVLinkブリッジは、一方のボードのU11をブリッジするだけで正常に機能します。
NVLink有効化のファームウェア側では、追加のホスト側コマンドでバイパスする必要があるROMチェックがあります。あなたのクランカーならきっとわかるでしょう ;)
NVLinkアンロックを調査中に、GA100のNVIDIAのNVLink実装に関する興味深い癖もいくつか見つけました。これについては、さらにブログ記事を投稿する予定ですので、ご期待ください!
将来の方向性
任意のヒューズバーニングにより、主に機能アンロックが得られます。セキュリティが重要な一部のオプションはデフォルトで未破壊で出荷されており、それらを破壊すると興味深い足がかりが得られる可能性があります。しかし、私にとってより興味深いのは、多くのデフォルトで破壊されたセキュリティが重要なヒューズが未破壊として検出される深いグリッチ状態であり、デバッグHS実行のようなルートを可能にし、ダイ内部への前例のないアクセスを可能にします。
参考文献
- Jon Pry, A Canary in the Crypto Mine: Defeating Stack Protection in a GPU Secure Coprocessor (2026).
- Amogh Munikote, cmpunlocker (2026).
- Otto Bittner et al., The Forgotten Threat of Voltage Glitching: A Case Study on Nvidia Tegra X2 SoCs (2021).
- NVIDIA, US9230678B2: Integrated circuit having an enhanced fuseless fuse structure (2016).
- TSMC, TEF07F32X32HD18_PHRM_C180518 electrical fuse datasheet, rev. 120A (2018).
- hexkyz and SciresM, Je Ne Sais Quoi - Falcons over the Horizon (2021).
- TechPowerUp, NVIDIA GA100 GPU specifications.
- GA100VFI source repository.
フットノート
- 逸話によると、私が調査したCMP 170HX 8GBの10個のサンプルうち、64GBのみが使用可能で出荷されたのは1つだけで、残りはすべて80GBの機能的なフレームバッファサイズを持っています。↩
- Canary in the Crypto Mineの論文では10GB SKUで安定した80GBを主張していますが、実際に市場に出回っているカードでこれを達成できたものはほとんどなく、確実な証拠は乏しいです。一部の10GB SKUが実際に80GBを搭載して出荷されている可能性はありますが、コミュニティによるとその割合は非常に低いようです。ほとんどの「不安定な」80GBアンロックは、L2キャッシュと実際の40GBフレームバッファを介したメモリエイリアシングの組み合わせで説明されています。↩
- NVLinkを有効にするには、170HX PCBの欠落コンポーネントによる非常に小さなハードウェア改造も必要です。これについては後で詳しく説明します。↩
- 未テスト。↩ ↩2 ↩3