Más contenido relacionado
La actualidad más candente (20)
Similar a [CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long (20)
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
- 2. $whoami
• @zer0mem
• Tencent KeenLabのWindows
カーネル研究者
• Pwn2Own優勝者(2015/2016)、
wnieにノミネート(2015)
• ファジングで注目するもの:
state
• 武術太極拳拳士
Daniel
• @long123king
• Tencent KeenLabのWindows
カーネル研究者
• Pwn2Own優勝者(2016)
• ファジングで注目するもの:
データ「フォーマット」
• Windbgの専門家
Peter
- 4. Sandbox
• 攻撃対象領域を制限
• バグに対する潜在的景観
• それを悪用するために利用可能なメソッド
• ACL vs さまざまなカーネルオブジェクトへのアクセス
• 非ntos、非w32kドライバー
• さまざまなntosオブジェクト
• w32kフィルタリング
• sandbox化されたアプリが必要とするものに依存
• w32kロックダウン
- 7. 何だろう?
• カーネル トランザクション マネージャ
• 目的
• カーネルトランザクションマネージャ(KTM)は、トランザクショ
ンを使うアプリケーション開発を可能とする。トランザクションエ
ンジン自体はカーネルの内部にあるが、トランザクションはシ
ングルホスト内または分散ホスト間でカーネルまたはユー
ザーモードトランザクション向けに開発可能。
• KTMは、トランザクションNTFS(TxF)やトランザクションレジス
トリ(TxR)を実装するために使われる。TxFは、NTFSファイル
システム内でトランザクション処理ファイルシステムの操作を
可能とする。TxFは、トランザクション処理レジストリの操作を
可能とする。KTMは、クライアントアプリケーションがトランザク
ションでのファイルシステムやレジストリ操作と連動することを
可能とする。
- 13. CLFS - データファジング I.
• わたしは、カーネルのデータファジングのファンでは
ない
• わたしは、カーネルでデータのパーシングをすることには全くもっ
て強く反対している☺
• 手っ取り早い調査をしてみよう。以下のものならば
わたしもOK:
• ファイルをランダムに変更する
• 結果 = ゼロ
• わたしにとってナイスなもの。というか、わたしはあまり興味がな
い
• 本来のアイディアに立ち戻る!
- 14. CLFS - ステートファジング
• アプローチ 1.
• リバース・エンジニアリング:clfs.sys
• ioctl に行く
• ...あぁ、最初からやるのは面倒すぎる...
• アプローチ 2.
• MSDNドキュメントを読み通す
• そのAPI群がどのように動くかを理解する
• 自身または別のAPIを正常に呼び出すために必要なコール
スタック
• Qilin(わたし達の内部ファズツール)にそのロジックを実装する
• Qilinのロジックにほんの少し干渉する
- 16. CLFS - データファジング II.
• リバースエンジニアリング:どこで & どのように
データがパースされるのか
• エントリー・ポイント: ClfsCreateLogFile
• 痛っ… マジック… ダミーのファズ防御
• I. crc
• II. 再配置が必要
- 35. シンボルハッシュ関数
__int64 ClfsHashPJW(const struct _UNICODE_STRING *a1)
{
unsigned int v1 = 0, v4 = 0, v6;
PWSTR wchar_buffer = a1->Buffer;
const struct _UNICODE_STRING *v3 = a1;
if ( a1->Length & 0xFFFE ){
do{
int v5 = 0x10 * v1 + RtlUpcaseUnicodeChar(*wchar_buffer);
v6 = v5 & 0xF0000000;
if ( v5 & 0xF0000000 )
v5 ^= v6 >> 0x18;
v1 = v6 ^ v5;
++wchar_buffer;
++v4;
}
while ( v4 < (unsigned int)v3->Length >> 1 );
}
return v1;
}
- 38. 強化CFLSフォーマットファジング
class CControlRecord : public CFormatBase<CControlRecord>
{
……
virtual bool serialize(ostream & out) const override;
virtual bool deserialize(istream & in) override;
virtual bool mutate() override;
……
};
class CBaseLogRecord : public CFormatBase<CBaseLogRecord>
{
……
virtual bool serialize(ostream & out) const override;
virtual bool deserialize(istream & in) override;
virtual bool mutate() override;
……
};
……
- 39. 強化CFLSフォーマットファジング
bool CCLFSFormat::deserialize(istream & in)
{
……
m_controlRecord.deserialize(in);
m_controlRecordShadow.deserialize(in);
m_baseLogRecord.deserialize(in);
m_baseLogRecordShadow.deserialize(in);
m_truncateRecord.deserialize(in);
m_truncateRecordShadow.deserialize(in);
……
}
bool CCLFSFormat::mutate(istream & in)
{ …… }
bool CCLFSFormat::serialize(istream & in)
{ …… }
- 40. 強化CFLSフォーマットファジング
CCLFSDocument::CCLFSDocument(const string filename)
:m_template_filename(filename)
,m_template_stream(filename, ios::in | ios::binary)
{
/* number: 0 */m_engine.registerFilter(make_unique<CCommonErrorBypass>());
/* number: 1 */m_engine.registerFilter(make_unique<CPOC_XXX_1>());
/* number: 2 */m_engine.registerFilter(make_unique<CPOC_XXX_2>());
/* number: 3 */m_engine.registerFilter(make_unique<CPOC_XXX_3>());
/* number: 4 */m_engine.registerFilter(make_unique<CPOC_XXX_4>());
/* number: 5 */m_engine.registerFilter(make_unique<CPOC_XXX_5>());
……
}
void CCLFSDocument::mutate()
{
m_clfs_format.mutate();
m_engine.triggerFilter(3, m_orginal_clfs_format, m_clfs_format);
}