HashTable と HashDos

3,507 views

Published on

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,507
On SlideShare
0
From Embeds
0
Number of Embeds
701
Actions
Shares
0
Downloads
19
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

HashTable と HashDos

  1. 1. HashTable とHashDoS @yuya_takeyama
  2. 2. For theBeginners
  3. 3. By aBeginner
  4. 4. アジェンダ•ハッシュテーブルとは• PHP におけるハッシュテーブル• PHP における HashDoS
  5. 5. ハッシュテーブルとは•Key から Value を検索• 連想配列に使われる• 基本的には効率的で高速• 最悪の場合はとても非効率に
  6. 6. http://www.is.titech.ac.jp/ kishi/classes/java11/java09.html
  7. 7. PHP における ハッシュテーブル•HashTable 構造体• 複数の Bucket 構造体から成る• 順番を保持
  8. 8. typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection;} HashTable;
  9. 9. typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; テーブルの dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection;} HashTable; スロット数
  10. 10. typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection;} HashTable; 要素数
  11. 11. typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; 先頭 dtor_func_t pDestructor; zend_bool persistent; または unsigned char nApplyCount; zend_bool bApplyProtection;} HashTable; 末尾の要素
  12. 12. typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; Bucket *pListTail; Bucket **arBuckets; dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; 要素の 集まり zend_bool bApplyProtection;} HashTable;
  13. 13. ドユコト?
  14. 14. 可視化しましょう 
  15. 15. <?phphashtable_dump(array(1, 2, 3, 4, 5, 6, 7, 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 8pListHead: 0pListTail: 7**arBuckets: 0 => [0, NULL] 1 => [1, NULL] 2 => [2, NULL] 3 => [3, NULL] 4 => [4, NULL] テーブルの 5 => [5, NULL] 6 => [6, NULL]*/ 7 => [7, NULL] スロット数
  16. 16. <?phphashtable_dump(array(1, 2, 3, 4, 5, 6, 7, 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 8pListHead: 0pListTail: 7**arBuckets: 0 => [0, NULL] 1 => [1, NULL] 2 => [2, NULL] 3 => [3, NULL] 4 => [4, NULL] 5 => [5, NULL] 6 => [6, NULL]*/ 7 => [7, NULL] 要素数
  17. 17. <?phphashtable_dump(array(1, 2, 3, 4, 5, 6, 7, 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 8pListHead: 0pListTail: 7**arBuckets: 0 => [0, NULL] 1 => [1, NULL] 先頭 2 => [2, NULL] 3 => [3, NULL] 4 => [4, NULL] 5 => [5, NULL] または 6 => [6, NULL]*/ 7 => [7, NULL] 末尾の要素
  18. 18. <?phphashtable_dump(array(1, 2, 3, 4, 5, 6, 7, 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 8pListHead: 0pListTail: 7**arBuckets: 0 => [0, NULL] 1 => [1, NULL] 2 => [2, NULL] 3 => [3, NULL] 4 => [4, NULL] 5 => [5, NULL] 要素の 6 => [6, NULL]*/ 7 => [7, NULL] 集まり
  19. 19. Bucket 構造体•値の入れ物• 配列内の一要素を表現• 二重の双方向リスト
  20. 20. typedef struct bucket { ulong h; uint nKeyLength; void *pData; キーの数値 void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; または struct bucket *pLast; const char *arKey; キー文字列の} Bucket;ここあんまり自信無いです... ハッシュ値
  21. 21. typedef struct bucket { ulong h; uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; struct bucket *pLast; const char *arKey;} Bucket; キー文字列
  22. 22. typedef struct bucket { ulong h; uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; struct bucket *pLast; const char *arKey;} Bucket;まだよく読めてないです... 値
  23. 23. typedef struct bucket { ulong h; uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; ハッシュ struct bucket *pLast; const char *arKey; テーブル内の} Bucket; 前後の要素
  24. 24. typedef struct bucket { ulong h; uint nKeyLength; void *pData; void *pDataPtr; struct bucket *pListNext; struct bucket *pListLast; struct bucket *pNext; struct bucket *pLast; const char *arKey; スロット内の} Bucket; 前後の要素
  25. 25. 二重の双方向リスト•ハッシュテーブル内のリスト-> 配列の走査に使う•スロット内のリスト-> ハッシュ値の衝突時に連結
  26. 26. https://www.codeblog.org/blog/moriyoshi/20060824.html
  27. 27. p = ht->pListHead;while (p != NULL) { // p にごにょごにょする p = p->pListNext;} リスト全体の 走査
  28. 28. h = ハッシュ値の計算(arKey, nLength);// スロット番号の算出nIndex = h & ht->nTableMask;p = ht->arBuckets[nIndex];while (p != NULL) { if (キーが等しければ) { *pData = p->pData; return SUCCESS; } キーに p = p->pNext;}return FAILURE; よる探索
  29. 29. PHP におけるHashDoS
  30. 30. テキストhttp://blog.tokumaru.org/2011/12/webdoshashdos.html
  31. 31. HashDoS とは•ハッシュ値の衝突する連想配列を作る• Web アプリに入力として与える•非効率な挿入・検索が起こる•効率よく DoS アタックができる
  32. 32. <?phphashtable_dump(array(0 => 1, 8 => 2, 16 => 3, 24 => 4, 32 => 5, 40 => 6, 48 => 7, 56 => 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 57pListHead: 0pListTail: 56**arBuckets: 0 => [56, 48, 40, 32, 24, 16, 8, 0, NULL] 1 => [NULL] 全ての要素が 2 => [NULL] 3 => [NULL] 4 => [NULL] 5 => [NULL] 6 => [NULL]*/ 7 => [NULL] 同じスロットに
  33. 33. <?phphashtable_dump(array(0 => 1, 8 => 2, 16 => 3, 24 => 4, 非効率な 32 => 5, 40 => 6, 48 => 7, 56 => 8));/*nTableSize: 8nTableMask: 7nNumOfElements: 8nNextFreeElement: 57pListHead: 0pListTail: 56**arBuckets: 0 => [56, 48, 40, 32, 24, 16, 8, 0, NULL] 探索 1 => [NULL] 全ての要素が 2 => [NULL] 3 => [NULL] 4 => [NULL] 5 => [NULL] 6 => [NULL]*/ 同じスロットに 7 => [NULL]
  34. 34. HashDoS への対策•入力による HashTable の生成を制限する (max_input_vars とか)•根本的解決では無いが, 現実的なリスクを軽減できる• 続きは徳丸さんのブログで
  35. 35. 根本的な解決の事例•Perl (5.8.1 以降)• Ruby (1.8.7-p356 より後)• ハッシュ値の予測を困難にする? まだよく調べてません...
  36. 36. まとめ•PHP の HashTable はHashDoS に対して脆弱である• 運用でカバーしましょう• 詳しくは徳丸さんのブログで
  37. 37. ご清聴 ありがとうございました
  38. 38. 参考資料• アルゴリズムとデータ構造編 第14章 ハッシュ探索①(チェイン法) http://www.geocities.jp/ky_webid/algorithm/014.html• PHPソースコードリーディング入門(とっかかり編) http://d.hatena.ne.jp/anatoo/20111031/1319991834• Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策 http://blog.tokumaru.org/2011/12/webdoshashdos.html• Zend_Hash_Del_Key_Or_Index Vulnerability http://www.hardened-php.net/hphp/ zend_hash_del_key_or_index_vulnerability.html• ハッシュテーブルの実装 https://www.codeblog.org/blog/moriyoshi/20060824.html• PHP のコア: Zend Engine ハッカーの手引き http://www.php.net/manual/ja/internals2.php• PHP Extensions: Understanding and working with hash API Part 1 http://zendguru.wordpress.com/2009/05/10/php-extensions- understanding-and-working-with-hash-api-part-1/

×