• 検索結果がありません。

自己紹介 名前 : 一ノ瀬太樹 所属 : HASH コンサルティング株式会社 OWASP Japan プロモーションチーム OWASP ZAP ユーザーグループ脆弱性診断研究会 ( 管理者その 3) Perl 入学式 ( サポーター ) HASH Consult

N/A
N/A
Protected

Academic year: 2021

シェア "自己紹介 名前 : 一ノ瀬太樹 所属 : HASH コンサルティング株式会社 OWASP Japan プロモーションチーム OWASP ZAP ユーザーグループ脆弱性診断研究会 ( 管理者その 3) Perl 入学式 ( サポーター ) HASH Consult"

Copied!
37
0
0

読み込み中.... (全文を見る)

全文

(1)

Affected指定されているけどPoCが無いフ

レームワークで再現試験をした話

2016/8/16 一ノ瀬 太樹

(2)

自己紹介

名前:

一ノ瀬 太樹

Twitter:

@mahoyaya

所属:

HASHコンサルティング株式会社

OWASP Japan プロモーションチーム

OWASP ZAP ユーザーグループ

脆弱性診断研究会(管理者その3)

(3)
(4)

http://blog.hash-c.co.jp/2016/07/httpoxyaffectedpoc.html

(5)

httpoxyは警視庁による注意喚起もされており、非常に注

目を集めています。

(6)

httpoxyの原因

httpoxyの根本的な原因はCGIの仕様と一般的に利用される環境

変数との名前空間の衝突

そのため、CGIやCGIライクな環境を利用している場合に

httpoxyの影響を受ける可能性がある

(7)

具体的な動作

CGIでは、クライアントが送信したHTTPリクエストヘッダの情報を環境変

数に設定する際の動作がRFC3875で規定されている

大文字に変換

ハイフン"-"をアンダースコア"_"に変換

名前の先頭に"HTTP_"を付与

(8)

例えば次のリクエストがあると

1 GET /index.php HTTP/1.1 2 Host: foo.example.com 3 Proxy: 10.0.0.1:8080

CGIの動作により次の環境変数がセットされる

1 HTTP_PROXY=10.0.0.1:8080

ただし、この動作だけで問題が発生するわけではない

(9)

HTTP_PROXYという環境変数は、一般的にCLIで利用されるコマン

ドベースのアプリケーションがProxyサーバを利用する際に参照す

るもの

この脆弱性が存在するWebサーバが環境変数を参照して外部通信

を行う場合に次の問題が発生する

内部サーバ宛てhttp通信の盗聴

外部サーバ宛てhttp通信の盗聴および改ざん(中間者攻撃)

(10)

本脆弱性への対処

PHPでは最新の5.5.38, 5.6.24, 7.0.9, 7.1.0-beta1にてgetenv関数にlocal_onlyの引数を持つこ

とが出来るようになる修正が含まれたことを確認。

今回利用しているフレームワークのArtaxでは2.0.4で修正されている。

回避策は大きく次の方法がある

HTTPリクエストヘッダを書き変える

• Apache HTTP Serverのmod_headersやNginxのfastcgi_paramなどが利用できる

WAFでDropする

• Apache HTTP Serverのmod_rewriteなどが利用できる

外部接続にHTTPSを利用する

• アプリケーションがHTTPS_PROXYを参照するようになり、原理的に影響を受けなくなる

(11)

その他の回避策

httpoxy公式

https://httpoxy.org/

nginx公式の注意喚起

(12)

再現試験をした

httpoxyに関してはhttpoxy.orgによるPoCが既に公開されており、

ネタとしては面白くない。

なので、AffectedになっているがPoCは公開されていないPHPの

フレームワークであるArtax v2.0.3を利用して試験!

(13)
(14)

環境

(15)

本当の構成

Apache HTTP Server 2.2.15 + PHP 5.5.37

(16)

事象が再現したことを確認するためのPHPファイ

ル “httpoxy.php“を作る

(17)

# code

1 <?php

2 use Amp¥Artax¥Client;

3 require 'artax/vendor/autoload.php'; 4

5 echo "<h1>httpoxy exploit check</h1><br>¥n";

6 echo "<br>==============================================<br>¥n"; 7 echo "var_dump(¥$_SERVER['HTTP_PROXY']);¥n"; 8 var_dump($_SERVER['HTTP_PROXY']); 9 echo "<br>"; 10 echo "getenv('HTTP_PROXY');¥n"; 11 var_dump(getenv('HTTP_PROXY')); 環境変数を表示 環境変数を表示

(18)

# code

15

16 try {

17 $client = new Client;

18 $promise = $client->request('http://www.example.jp'); 19 $response = Amp¥wait($promise); 20 printf( 21 "¥nHTTP/%s %d %s¥n", 22 $response->getProtocol(), 23 $response->getStatus(), 24 $response->getReason() 25 );

26 } catch (Exception $error) { 27 echo $error;

外部通信を行う

(19)
(20)

環境変数にHTTP_PROXYをセットさせてみる

HTTPリクエストヘッダに“Proxy: 192.168.80.1:8080”などを設定してリクエストを送ると環

境変数をセットさせることが出来る。

“192.168.80.1”はWindows10のIPアドレスだが、ポート番号8080のアクセスは受け付けない

状態なので、「ARPは解決できるが、TCP接続は受け付けない状態」

(21)

curlを利用してリクエストを送信する

(22)

結果

# Response

6 var_dump($_SERVER['HTTP_PROXY']);

7 <pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'192.168.80.1:8080'</font> <i>(length=17)</i>

8 </pre><br>getenv('HTTP_PROXY');

9 <pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'192.168.80.1:8080'</font> <i>(length=17)</i> 10 </pre><br><br>============================================= =<br> 11 12 HTTP/1.1 200 OK 読み込まれてる 読み込まれてる

(23)

結果

# Response

6 var_dump($_SERVER['HTTP_PROXY']);

7 <pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'192.168.80.1:8080'</font> <i>(length=17)</i>

8 </pre><br>getenv('HTTP_PROXY');

9 <pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'192.168.80.1:8080'</font> <i>(length=17)</i>

10 </pre><br><br>============================================= =<br>

読み込まれてる

(24)

結果

# Response

(25)
(26)

Artaxのコードを確認した

1.ArtaxはProxyのパラメータを2つのオブジェクト(Client, HttpSocketPool)内に同じ

配列名かつ同じ変数名の“$options[self::OP_PROXY_HTTP]”で保持しており、

“getenv(‘http_proxy’)”で取得した値はHttpSocketPool側で保持している。

2.“new Client;”したタイミングでコンストラクタにより“new HttpSocketPool;”も実行

され、自動的に環境変数が読み込まれる。

※"self::OP_PROXY_HTTP"は双方共にHttpSocketPoolの定数を参照

3. 2つのオブジェクトが保持している配列のパラメータはリクエストを送信する際に

array_merge関数によってマージされるが、オブジェクトClientのパラメータで上書きさ

(27)
(28)

以下は、HttpSocketPool内のcheckout関数で利用されている実際のコード

$options にオブジェクトClientで設定されているパラメータが格納されている

# code

57 $options = $options ? array_merge($this->options, $options) : $this->options;

ProxyのパラメータはオブジェクトClientの初期化時に必ず空(‘’)で生成されるた

め上書きされてしまう

(29)

すごくモヤモヤする仕様だし、

脆弱性になっていない

(30)
(31)

コードを書き換えよう(ぇ

# code

57 //$options = $options ? array_merge($this->options, $options) : $this->options; 58 $options = $options ? array_merge($options, $this->options) : $this->options;

(32)
(33)

172.20.10.0/24 .3 .6 Fedora22(Server) Mac(Client) VM テザリング .1 稼働サービス Proxy: 8080 稼働サービス Httpd: 80 HASHのブログ

DEMO構成

(34)

172.20.10.0/24 .3 .6 Fedora22(Server) Mac(Client) VM テザリング .1 稼働サービス Proxy: 8080 稼働サービス Httpd: 80 HASHのブログ

通常通信

(35)

172.20.10.0/24 .3 .6 Fedora22(Server) Mac(Client) VM テザリング .1 稼働サービス Proxy: 8080 稼働サービス Httpd: 80 HASHのブログ

Proxy通信

(36)

まとめ

検証を実施した限り、オブジェクトClientを生成してリクエスト送信した

場合において問題事象が発生することはなさそう。

しかし、絶対に問題が発生しないと保証することはできないので、Artax

を利用される方は、

必ずv2.0.4以降へのバージョンアップを検討してください。

※公開している内容やアプリケーションの動作を保証するものではありません。公開情報を利用さ れる場合は、必ずご自身で検証されたうえでの利用をお願いします。

(37)

参照

関連したドキュメント

          ITEC INTERNATIONAL 株式会社. 型名

自動車販売会社(2社) 自動車 自動車販売拠点設備 1,547 自己資金及び借入金 三菱自動車ファイナンス株式会社 金融 システム投資 他

BIGIグループ 株式会社ビームス BEAMS 株式会社アダストリア 株式会社ユナイテッドアローズ JUNグループ 株式会社シップス

三洋電機株式会社 住友電気工業株式会社 ソニー株式会社 株式会社東芝 日本電気株式会社 パナソニック株式会社 株式会社日立製作所

訂正前

波部忠重 監修 学研生物図鑑 貝Ⅱ(1981) 株式会社 学習研究社 内海富士夫 監修 学研生物図鑑 水生動物(1981) 株式会社 学習研究社. 岡田要 他

当法人は、40 年以上の任意団体での活動を経て 2019 年に NPO 法人となりました。島根県大田市大 森町に所在しており、この町は

東京電力パワーグリッド株式会社 東京都千代田区 東電タウンプランニング株式会社 東京都港区 東京電設サービス株式会社