Accueil
Explorer
Soumettre la recherche
Mettre en ligne
S’identifier
S’inscrire
Publicité
HashTable と HashDos
Signaler
Yuya Takeyama
Suivre
Web Engineer à A company related with music industry
27 Jan 2012
•
0 j'aime
3 j'aime
×
Soyez le premier à aimer ceci
afficher plus
•
2,707 vues
vues
×
Nombre de vues
0
Sur Slideshare
0
À partir des intégrations
0
Nombre d'intégrations
0
Check these out next
Lisp batton - Common LISP
Masaomi CHIBA
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Fujio Kojima
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
CODE BLUE
0x300
geek_alice
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
PHP AST 徹底解説
do_aki
1
sur
40
Top clipped slide
HashTable と HashDos
27 Jan 2012
•
0 j'aime
3 j'aime
×
Soyez le premier à aimer ceci
afficher plus
•
2,707 vues
vues
×
Nombre de vues
0
Sur Slideshare
0
À partir des intégrations
0
Nombre d'intégrations
0
Télécharger maintenant
Télécharger pour lire hors ligne
Signaler
Technologie
Business
Yuya Takeyama
Suivre
Web Engineer à A company related with music industry
Publicité
Publicité
Publicité
Recommandé
php7's ast
do_aki
9.1K vues
•
27 diapositives
Haskell で CLI
Nobutada Matsubara
3.3K vues
•
31 diapositives
ActiveResourceが面白すぎる件
Kazuki MATSUMOTO
3K vues
•
20 diapositives
メタメタプログラミングRuby
emasaka
990 vues
•
49 diapositives
CPANの依存モジュールをもう少し正しく検出したい
charsbar
3.3K vues
•
90 diapositives
CMSとPerlで遊ぼう
Daiki Ichinose
1.9K vues
•
17 diapositives
Contenu connexe
Présentations pour vous
(20)
Lisp batton - Common LISP
Masaomi CHIBA
•
1.1K vues
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
•
21.8K vues
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Fujio Kojima
•
3.3K vues
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
CODE BLUE
•
4K vues
0x300
geek_alice
•
827 vues
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
•
2.5K vues
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
•
2.8K vues
PHP AST 徹底解説
do_aki
•
25.4K vues
LINQソースでGO!
Kouji Matsui
•
2.2K vues
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
•
18.7K vues
Php5.4
ke-m kamekoopa
•
1.6K vues
OPcache の最適化器の今
y-uti
•
10.2K vues
php-src の歩き方
do_aki
•
2.3K vues
PECL を数えてみた
y-uti
•
4K vues
前期講座09
Takenori Nakagawa
•
573 vues
しょしんしゃのためのhello world
wata2ki
•
140 vues
Glibc malloc internal
Motohiro KOSAKI
•
60.4K vues
PHP と SAPI と ZendEngine3 と
do_aki
•
15.9K vues
Livesense tech night immutable-js at a glance
Yuta Shimakawa
•
1.8K vues
Ll xcode
Net Kanayan
•
1.1K vues
Similaire à HashTable と HashDos
(20)
⑲jQueryをおぼえよう!その5
Nishida Kansuke
•
1.6K vues
What is Metasepi?
Kiwamu Okabe
•
2K vues
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
•
9.7K vues
Write good parser in perl
Jiro Nishiguchi
•
2.9K vues
Dive into RTS - another side
Kiwamu Okabe
•
1.4K vues
Project lambda
Appresso Engineering Team
•
759 vues
PHPでマルチスレッド
karky7
•
221 vues
test
a1yama1123
•
188 vues
Php in ruby
do_aki
•
2.8K vues
ConcurrentHashMap Code Reading
Naoyuki Kakuda
•
1.7K vues
01 php7
Satoshi Yoshimura
•
438 vues
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
•
3.3K vues
async/await のしくみ
信之 岩永
•
19.3K vues
Material
_TUNE_
•
3.5K vues
How to debug a perl script using gdb
akirahiguchi
•
2.9K vues
20141129-dotNet2015
Takayoshi Tanaka
•
13.2K vues
URLで遊ぼう
Hiraku Nakano
•
6K vues
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Akabane Hiroyuki
•
4.1K vues
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Toshi Harada
•
2.4K vues
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
•
2.1K vues
Publicité
Plus de Yuya Takeyama
(16)
5分でわかる? 関数型 PHP の潮流
Yuya Takeyama
•
4K vues
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
•
3.8K vues
Reactor Pattern and React
Yuya Takeyama
•
4.5K vues
PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)
Yuya Takeyama
•
1.5K vues
PHP と MySQL でカジュアルに MapReduce する (Short Version)
Yuya Takeyama
•
4.2K vues
PHP と MySQL でカジュアルに MapReduce する
Yuya Takeyama
•
3.9K vues
PHPUnit でテスト駆動開発を始めよう
Yuya Takeyama
•
16K vues
MySQL 入門的なはなし
Yuya Takeyama
•
2.6K vues
Proposal for xSpep BDD Framework for PHP
Yuya Takeyama
•
976 vues
Building Development Environment with php-build and phpenv
Yuya Takeyama
•
3K vues
PHPUnit でよりよくテストを書くために
Yuya Takeyama
•
9.7K vues
Making DSL with []
Yuya Takeyama
•
1.7K vues
LIMIT 付きで UPDATE を行うと何故怒られるか
Yuya Takeyama
•
1.2K vues
GOOS #1
Yuya Takeyama
•
723 vues
Ruby 同好会宣言
Yuya Takeyama
•
753 vues
第一回 社内勉強会 PHP Application Security Checklist に学ぶ PHP セキュリティ (Excerpt)
Yuya Takeyama
•
1.4K vues
Dernier
(20)
①【戴尔豪斯大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 vues
ChatGPT + LlamaIndex 0 .6 による チャットボット の実装
Takanari Tokuwa
•
26 vues
《杨百翰大学毕业证|学位证书校内仿真版本》
d520dasw12
•
2 vues
JSONEncoderで詰まった話
とん とんぼ
•
0 vue
留信网认证可查【皇家霍洛威学院文凭证书毕业证购买】
32lkhng
•
2 vues
SoftwareControl.pdf
ssusercd9928
•
15 vues
☀️【卡尔顿大学毕业证成绩单留学生首选】
15sad
•
2 vues
MC-800DMT intrusion detector manual
Vedard Security Alarm System Store
•
0 vue
JSTQB_テストプロセスの概念モデル.pdf
akipii Oga
•
109 vues
20230523_IoTLT_vol99_kitazaki_v1.pdf
Ayachika Kitazaki
•
107 vues
オレオレになりがちなテスト計画を見直した話
terahide
•
25 vues
☀️【中央兰开夏大学毕业证成绩单留学生首选】
25mjhd12
•
4 vues
量子論.pdf
hiro150493
•
0 vue
CDLEハッカソン2022参加報告.pdf
SHOIWA1
•
7 vues
3Dプリンタって いいね
infinite_loop
•
0 vue
①【麦吉尔大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 vues
Forguncy8 製品概要 202305.pptx
フォーガンシー
•
7 vues
留信网认证可查【拜欧拉大学文凭证书毕业证购买】
1lkjhg
•
3 vues
ネットワークパケットブローカー市場.pdf
HinaMiyazu
•
5 vues
統計学の攻略_推測統計学の考え方.pdf
akipii Oga
•
115 vues
Publicité
HashTable と HashDos
HashTable
と HashDoS @yuya_takeyama
For
the Beginners
By
a Beginner
アジェンダ •ハッシュテーブルとは • PHP におけるハッシュテーブル •
PHP における HashDoS
ハッシュテーブルとは •Key から Value
を検索 • 連想配列に使われる • 基本的には効率的で高速 • 最悪の場合はとても非効率に
http://www.is.titech.ac.jp/ kishi/classes/java11/java09.html
PHP
における ハッシュテーブル •HashTable 構造体 • 複数の Bucket 構造体から成る • 順番を保持
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;
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; スロット数
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; 要素数
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; 末尾の要素
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;
ドユコト?
可視化 しましょう
<?php hashtable_dump(array(1, 2, 3,
4, 5, 6, 7, 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 8 pListHead: 0 pListTail: 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] スロット数
<?php hashtable_dump(array(1, 2, 3,
4, 5, 6, 7, 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 8 pListHead: 0 pListTail: 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] 要素数
<?php hashtable_dump(array(1, 2, 3,
4, 5, 6, 7, 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 8 pListHead: 0 pListTail: 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] 末尾の要素
<?php hashtable_dump(array(1, 2, 3,
4, 5, 6, 7, 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 8 pListHead: 0 pListTail: 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] 集まり
Bucket 構造体 •値の入れ物 • 配列内の一要素を表現 •
二重の双方向リスト
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; ここあんまり自信無いです... ハッシュ値
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; キー文字列
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; まだよく読めてないです... 値
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; 前後の要素
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; 前後の要素
二重の双方向リスト •ハッシュテーブル内のリスト -> 配列の走査に使う •スロット内のリスト -> ハッシュ値の衝突時に連結
https://www.codeblog.org/blog/moriyoshi/20060824.html
p = ht->pListHead; while
(p != NULL) { // p にごにょごにょする p = p->pListNext; } リスト全体の 走査
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; よる探索
PHP における HashDoS
テキスト http://blog.tokumaru.org/2011/12/webdoshashdos.html
HashDoS とは •ハッシュ値の衝突する連想配列を作る • Web
アプリに入力として与える •非効率な挿入・検索が起こる •効率よく DoS アタックができる
<?php hashtable_dump(array(0 => 1,
8 => 2, 16 => 3, 24 => 4, 32 => 5, 40 => 6, 48 => 7, 56 => 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 57 pListHead: 0 pListTail: 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] 同じスロットに
<?php hashtable_dump(array(0 => 1,
8 => 2, 16 => 3, 24 => 4, 非効率な 32 => 5, 40 => 6, 48 => 7, 56 => 8)); /* nTableSize: 8 nTableMask: 7 nNumOfElements: 8 nNextFreeElement: 57 pListHead: 0 pListTail: 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]
HashDoS への対策 • 入力による HashTable
の生 成を制限する (max_input_vars とか) • 根本的解決では無いが, 現実的 なリスクを軽減できる • 続きは徳丸さんのブログで
根本的な解決の事例 •Perl
(5.8.1 以降) • Ruby (1.8.7-p356 より後) • ハッシュ値の予測を困難にす る? まだよく調べてません...
まとめ • PHP の HashTable
は HashDoS に対して脆弱であ る • 運用でカバーしましょう • 詳しくは徳丸さんのブログで
ご清聴 ありがとう ございました
参考資料 •
アルゴリズムとデータ構造編 第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/
Publicité