Microsoft Word - FreeBSD_LDPRELOAD002.doc



Similar documents
SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

SOC Report

Apache-Tomcat と 冗長な UTF-8 表現 (CVE 検証レポート ) 2008 年 08 月 26 日 Ver. 0.1

slide5.pptx

SOC Report

SOC Report

プログラミング実習I

2. 留意事項セキュリティ対策を行う場合 次のことに留意してください 不正侵入対策の設定を行う場合 お使いのソフトウェアによっては今までのように正常に動作しなくなる可能性があります 正常に動作しない場合は 必要に応じて例外処理の追加を行ってください ここで行うセキュリティ対策は 通信内容の安全性を高

PowerPoint プレゼンテーション - 物理学情報処理演習

SOC Report

べきでない悪意のあるSQL 文が攻撃者から入力された場合 データベースで実行される前にSQL 文として処理されないよう無効化する必要がありますが ( 図 1 1) 無効化されずにデータベースで実行された場合 データベースの操作が可能となります ( 図 1 2) 本脆弱性を悪用するとデータベース接続ユ

SOC Report

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

演算増幅器

memo

PowerPoint プレゼンテーション

AquesTalk Win Manual

WEBシステムのセキュリティ技術

AquesTalk プログラミングガイド

Prog1_10th

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - kougi11.ppt

安全な Web サイトの作り方 7 版 と Android アプリの脆弱性対策 独立行政法人情報処理推進機構 (IPA) 技術本部セキュリティセンター Copyright 2015 独立行政法人情報処理推進機構

OpenAM 9.5 インストールガイド オープンソース ソリューション テクノロジ ( 株 ) 更新日 : 2013 年 7 月 19 日 リビジョン : 1.8

Template Word Document

kiso2-03.key

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

PowerPoint プレゼンテーション

SOC Report

AquesTalk for WinCE プログラミングガイド

共有フォルダ接続手順 1 共有フォルダ接続ツールのダウンロード 展開 CSVEX のトップページから共有フォルダ接続ツールの zip ファイルをダウンロードします ダウンロードした zip ファイルを右クリックして すべて展開 を選択します (Windows 環境では zip ファイルを解凍しなくて

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft Word - PGI WorkstationServer事前準備 doc

PowerPoint プレゼンテーション

スライド 1

Microsoft IISのWebDAV認証回避の脆弱性に関する検証レポート

ポインタ変数

Microsoft PowerPoint - 計算機言語 第7回.ppt

HULFT Series 製品における Javaの脆弱性(CVE )に対する報告

XAMPP で CMS のお手軽 テスト環境を手に入れよう 2011/5/21 上村崇 1

Gfarm/MPI-IOの 概要と使い方

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

脆弱性を狙った脅威の分析と対策について Vol 年 7 月 21 日独立行政法人情報処理推進機構セキュリティセンター (IPA/ISEC) 独立行政法人情報処理推進機構 ( 略称 IPA 理事長 : 西垣浩司 ) は 2008 年度におけ る脆弱性を狙った脅威の一例を分析し 対策をまと

これらの情報は 外部に登録 / 保存されることはございません 5 インターネット接続の画面が表示されます 次へ > ボタンをクリックしてください 管理者様へ御使用時に設定された内容を本説明文に加筆ください 特に指定不要で利用可能であった場合は チェックボックスを オフ していただきますようご案内くだ

6-2- 応ネットワークセキュリティに関する知識 1 独立行政法人情報処理推進機構

HeartCoreインストールマニュアル

DVIOUT

目次 1. はじめに WEB インタフェース... 4 アクセス方法... 4 操作方法 FTP クライアント FFFTP(WINDOWS) インストール方法 アクセス方法 操作方法 CYBERD

ポインタ変数

3.Cygwin で日本語を使いたい Cygwin で以下のコマンドを実行すると それ以降 メッセージが日本語になります export LANG=ja_JP.UTF-8 これは 文字コードを日本語の UTF-8 に設定することを意味しています UTF-8 は Cygwin で標準の文字コードで, 多

Microsoft PowerPoint - 【Webnner】はじめてのHULFT-WebFT.pptx

Microsoft Word - no11.docx

UIOUSBCOM.DLLコマンドリファレンス

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

<4D F736F F F696E74202D2091E63389F15F8FEE95F1835A834C A CC B5A8F FD E835A835890A78CE C CC835A834C A A2E >

PC にソフトをインストールすることによって OpenVPN でセキュア SAMBA へ接続することができます 注意 OpenVPN 接続は仮想 IP を使用します ローカル環境にて IP 設定が被らない事をご確認下さい 万が一仮想 IP とローカル環境 IP が被るとローカル環境内接続が行えなくな

Micro Focus Enterprise Developer チュートリアル メインフレーム COBOL 開発 : MQ メッセージ連携 1. 目的 本チュートリアルでは CICS から入力したメッセージを MQ へ連携する方法の習得を目的としています 2. 前提 使用した OS : Red H

ServerView RAID Manager VMware vSphere ESXi 6 インストールガイド

1. 画面説明 ここでは普通にアプリケーションを開いた場合に表示される対話型画面の説明をしています パスワード ( 再入力 ) パスワード登録 パスワード消去 事前チェックの処理の際に必要になるパスワ

Webアプリケーションでのlog4j利用ガイド

実験 5 CGI プログラミング 1 目的 動的にWebページを作成する手法の一つであるCGIについてプログラミングを通じて基本的な仕組みを学ぶ 2 実験 実験 1 Webサーバの設定確認と起動 (1)/etc/httpd/conf にある httpd.conf ファイルの cgi-bin に関する

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

01_08 インストールガイド

kantan_C_1_iro3.indd

TestDesign for Web

McAfee Application Control ご紹介

改版履歴 版数 改版日付 改版内容 /03/14 新規作成 2013/03まで製品サイトで公開していた WebSAM DeploymentManager Ver6.1 SQL Server 2012 製品版のデータベース構築手順書 ( 第 1 版 ) を本 書に統合しました 2

P.2 もくじ 8. ファイルのアップロードとダウンロード 8-. ファイルのアップロード 8-2. ファイル指定でアップロード 8-3. Zip 解凍アップロード 8-4. ドラッグ & ドロップで一括アップロード 8-5. ファイルのダウンロード 9. ファイルの送信 ( おすすめ機能 ) 9-

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

Prog1_6th

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - Android+TPMによるセキュアブート_KDDI研_後日配布用

Microsoft PowerPoint - 09.pptx

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

PowerPoint Presentation

< F2D837C E95CF CF68A4A94C5816A2E6A>

プログラミングI第10回

Microsoft PowerPoint ppt

延命セキュリティ製品 製品名お客様の想定対象 OS McAfee Embedded Control 特定の業務で利用する物理 PC 仮想 PC や Server 2003 Server 2003 ホワイトリスト型 Trend Micro Safe Lock 特定の業務で利用するスタンドアロン PC

インテル(R) Visual Fortran コンパイラ 10.0

program7app.ppt

P. もくじ 4.ShareDisk 機能 4-. アップロード方法の種類 アップロード可能なファイルサイズ 4-. ファイルの送信 ( ドラッグ & ドロップでアップロード (HTML5)) 4-3. ファイルの送信 ( ファイルずつ指定してアップロード ) 4-4. 送信状況一覧 4-5. ファ

2006

Taro-ファイル処理(公開版).jtd

情報処理演習 B8クラス

汎用プロキシ利用案内 汎用プロキシ利用案内 目次 汎用プロキシ利用案内 はじめに 汎用プロキシとは 利用可能なポート 概要 動作環境 インストール Windows <I

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint - kougi7.ppt

Transcription:

FreeBSD-SA-09:05.telnetd と LD_PRELOAD について N T T コ ミ ュ ニ ケ ー シ ョ ン ズ株式会社 IT マネジメントサービス事業部 セキュリティオペレーションセンタ 2009 年 02 月 20 日 Ver. 1.0

1. 調査概要... 3 2. FREEBSD-SA-09:05.TELNETD の再現... 3 2.1. FREEBSD7.1 の場合... 3 3. LD_PRELOAD とセキュア プログラミング... 5 3.1. LD_PRELOAD とは... 5 3.2. 過去の LD_PRELOAD を使った脆弱性... 8 3.3. LD_PRELOAD 攻撃の対策... 8 3.4. LD_PRELOAD 攻撃の対策のまとめ... 11 3.5. LD_PRELOAD と LIBSAFE... 12 4. 検証作業者... 12 5. 参考... 12 6. 履歴... 13 7. 最新版の公開 URL... 13 8. 本レポートに関する問合せ先... 13 2

1. 調査概要 2009 年 02 月 14 日 FreeBSD の Telnet デーモンに対して 0Day の攻撃方法が公開された ( 5 参考の 1 ) LD_PRELOAD を使って 不正なライブラリ ( 任意のコード ) を事前にロードさせることで Telnet デーモンの権限で任意のコードを実行させてしまうという問題である 本文書では この 0Day の再現 さらに LD_PRELOAD の仕組み LD_PRELOAD 攻撃の対策としてのセキュア プログラミングについて考察した結果を記す 2. FreeBSD-SA-09:05.telnetd の再現 2009 年 02 月 14 日 FreeBSD の Telnet デーモンに対して LD_PRELOAD を使うことで リモートから認証なしに root 権限を取得することができる脆弱性が公開された ( 5 参考の 1 ) この脆弱性に関する修正パッチも 2009 年 02 月 16 日に公開された ( 5 参考の 2 ) 本章では この問題の検証結果について記す 2.1. FreeBSD7.1 の場合 FreeBSD7.1 に対して 検証した結果を記す FreeBSD7.1 をインストール後 Telnet デーモンを起動した ( 図 2.1-1) また 事前に攻撃用のライブラリをインストールし コンパイルし /tmp 上の配置した ( 図 2.1-2) この検証用コードは _init() 関数の処理を シェルを起動する内容に置き換えるライブラリであることが分かる ( 図 2.1-2) その後 別の FreeBSD を使って 対象に対して Telnet コマンドを使って リモートからの root 権限取得に成功した ( 図 2.1-3) このように 今回公開された脆弱性は 以下の状況の時 リモートから root 権限を取得される危険性がある 対象にファイルを配置可能である 対象は Telnet デーモンを起動し Telnet 接続が可能である 対策は パッチの適用である 5 参考の 2 を参考にしてほしい 3

図 2.1-1 : 192.0.2.10 で動作する FreeBSD7.1 Telnetd も起動している 図 2.1-2 : 図 2.1-1 には 既に LD_PRELOAD で ロードさせるライブラリもインストール済である 4

図 2.1-3 : 192.0.2.12 の FreeBSD7.1 を使い 192.0.2.10 の root 権限の取得に成功した 3. LD_PRELOAD とセキュア プログラミング 3.1. LD_PRELOAD とは 環境変数 LD_PRELOAD とは ライブラリを事前にロードするために使われるものである 環境変数 LD_PRELOAD にライブラリを示すファイルパスを指定すると メインのプログラムが起動した際に 他のライブラリがロードされる前に呼び出される また 環境変数 LD_PRELOAD で指定したライブラリに含まれる関数の名前と 他のライブラリに含まれる関数の名前が重複した場合 環境変数 LD_PRELOAD で呼び出されたライブラリの関数が優先的に使用される このことから 本来呼び出されるライブラリの関数をフックする または置き換える目的で使用されることが 一般的な環境変数 LD_PRELOAD の使い方である しかしながら 呼び出される関数を置き換えられる という特性から 悪意をもって置き換えられるなどすることによって不正使用に悪用される危険性もある 例えば 図 3.1-1 のようなプログラムをサンプルとしてみる 環境は 以下である OS : CentOS5.1 gcc4.1.2 図 3.1-1 は プログラムの第一引数にパスワードを与え そのパスワードが正しいかどうか (foobar かどうか ) を確認するプログラムである これを gcc でコンパイルする ( 図 3.1-2) 5

図 3.1-3 でプログラムを動かし 第一引数が foobar かどうかで 出力するメッセージが異なることが確認できる 図 3.1-1 は 文字列比較 ( 認証処理 ) として 標準の strcmp() 関数を用いているが 図 3.1-4 のように 文字列比較をしないが同名の strcmp() 関数を定義し 共有ライブラリとしてコンパイルする この図 3.1-4 で作成されたライブラリを LD_PRELOAD 環境変数にセットした上で 図 3.1-1 のプログラムを起動すると 本来は標準の strcmp() 関数が呼び出されるところを図 3.1-4 で新たに定義した関数が呼び出され どんな文字列を第一引数に与えても foobar を与えたと同じ結果となるように動作していることが確認できる ( 図 3.1-5) このように 認証処理や暗号化処理のライブラリが置き換えられるというセキュリティ上の危険性が存在する 図 3.1-1 : プログラムに与える第一引数が正しい (foobar) かどうか確認するプログラム 単純に strcmp() 関数を使って比較している 図 3.1-2 : 図 3.1-1 を gcc4.1.2 CentOS5.1 でコンパイルした 6

図 3.1-3 : 図 3.1-1 の第一引数に foobar を与えた場合は許可され それ以外では禁止される 図 3.1-4 : 文字列比較をしない strcmp() 関数を用意し 共有ライブラリとしてコンパイルする 図 3.1-5 : 図 3.1-4 を LD_PRELOAD によって事前ロードさせることで 図 3.1-1 のプログラムの認証回避が可能となることが分かる 7

3.2. 過去の LD_PRELOAD を使った脆弱性 3.1 LD_PRELOAD とは で示したように ライブラリを置換したりすることができるためこの手法自体は非常に有効なテクニックであるが この LD_PRELOAD に起因する脆弱性は 過去にいろいろなソフトウェアで報告されている ( 5 参考の 3~5 ) このように UNIX/Linux に対しての Local Exploit という観点では LD_PRELOAD を使った攻撃方法は古典的であるが 今一度 次の節から LD_PRELOAD の悪用を防止する対策について検討してみたい 3.3. LD_PRELOAD 攻撃の対策 今回は 複数ある対策方法のうち unistd.h で定義されている environ 変数を使って 環境変数 LD_PRELOAD が定義されているかどうかを プログラムの先頭 (main() 関数の先頭 ) でチェックする方法を紹介する 環境変数 LD_PRELOAD が定義されていれば 環境変数 LD_PRELOAD を破壊した上で 自らのプログラム自身を再起動させるようにした サンプルとなるソースコードは 図 3.3-1 である プログラム起動直後に unistd.h で定義されている環境変数を保持している領域のポインタ environ を取得し 環境変数 LD_PRELOAD の有無をチェックしている 環境変数 LD_PRELOAD がある場合は 環境変数 LD_PRELOAD を無効化したうえで自分自身を再読み込みしている 環境変数を取得する関数 getenv() を使っていない理由は ただ一つ 関数だからである LD_PRELOAD によって getenv() 関数が危険な関数に置き換えられる危険性があるため environ を使って main 関数内部に処理 (while などを使って ) を実装している この対策のデメリットとしては 対策のコードをライブラリ化できない点であろう また 再起動させるための execv() 関数が LD_PRELOAD 環境変数によって置き換えられている可能性もあるため ( 図 3.3-4) そもそも環境変数を任意に設定できない環境で動作させる そういう環境で動作させることができない場合 LD_PRELOAD 環境変数が定義されているかどうかをプログラムの先頭でチェック後 定義されていれば終了するというのが 現実的な解決策ではないだろうか 8

#include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc,char* argv[]){ char passwd[] = "foobar"; char *envname = "LD_PRELOAD"; char **pp; char *p; char *p1; char *p2; int hint1; int hint2; // 正しいパスワード // 環境変数の領域で比較する文字列 /* Startup */ pp = environ; hint1 =0; while(*pp!= NULL && hint1 == 0){ p1 = *pp; // 環境変数を一つずつ取得 p2 = envname; // LD_PRELOAD そのもの hint2 = 0; while(*p2!= '\0' && hint2 == 0){ // 1Byte ずつ比較 if(*p1 == '\0'){ hint2++; }else{ if(*p1!= *p2){ hint2++; }else{ p = p1; // 多分 LD_PRELOAD の最後の文字の p1++; // 'D' を示しているはず p2++; } } } if(hint2 == 0){ hint1++; }else{ pp++; } } printf("hint1=%i\nhint2=%i\n",hint1,hint2); if(hint2 == 0){ printf("ld_preload found!\nreloaded...\n\n"); *p = '\0'; // 環境変数 LD_PRELOAD に NULL を入れて破壊する execv(argv[0],argv); // 自分自身をリロードする return 0; }else{ printf("ld_preload not found!\n"); } if(!strcmp(passwd,argv[1])){ printf("access allowed\n"); return 1; }else{ printf("access denied\n"); return 0; } return 0; } 図 3.3-1 : 図 3.1-1 を改造し 起動時に (char**)environ を使って 環境変数 LD_PRELOAD の有無をチェックするようにしたプログラム (login2.c) 9

図 3.3-2 : 図 3.3-1 をコンパイルし 実行する 第一引数が foobar の時とそれ以外の時でメッセージが異なることが確認できる 図 3.3-3 : 図 3.3-1 を LD_PRELOAD によって事前ロードさせても main() 関数の先頭で 環境変数 LD_PRELOAD の有無をチェックし 破壊後に再読み込みしているため strcmp() 関数の置き換えがおこなわれない 結果的に図 3.3-2 と同じ挙動となっていることが確認できる 10

図 3.3-4 : 図 3.3-3 では LD_PRELOAD でロードされたライブラリを無視することができたが リロードするために呼び出した execv() 関数が置き換えられて プログラムが乗っ取られているのが確認できる 3.4. LD_PRELOAD 攻撃の対策のまとめ もう一度まとめてみる 今回は 起動した最初の段階で環境変数 LD_PRELOAD を検索するようにプログラムを修正することを対策の一つとして取り上げた しかしながら 不特定多数の利用者にプロセスの環境変数を自由に設定可能である状態はセキュリティ上危険な状態であると評価してもいいのかも知れない よって プロセスの環境変数を自由に設定できない環境で プログラムを動作させる システム上に任意のファイルを書き込めないような環境で プログラムを動作させる (FTP サーバと同居している WebApplication サーバや ファイルアップロード機能付き WebApplication サーバなどの場合は 厳しい条件かも知れない ) プログラムが起動した最初の処理として 環境変数 LD_PRELOAD が定義されているかどうかチェックする 必要な環境変数以外を全て削除する処理を プログラムが起動した最初の処理として行う UNIX/Linux 上でアプリケーションを開発している読者諸氏は 今一度本文書で取り上げた古典的なライブラリの置換方法である LD_PRELOAD 対策が 自ら開発中のソフトウェアに必要かどうか 必要である場合は対策しているかどうかを再確認してみてはいかがだろうか 11

3.5. LD_PRELOAD と libsafe Libsafe という C 言語で書かれたプログラムのバッファオーバーフロー (BoF) などの脆弱性を防止するラッパー ライブラリがあるが このライブラリの使用に環境変数 LD_PRELOAD が使用されることがある ( 5 参考 12 ) libsafe もセキュリティ対策として必要な場合は 環境変数 LD_PRELOAD に libsafe 以外のライブラリが指定されないようなチェックが必要になる ( 3.3LD_PRELOAD 攻撃の対策 では 環境変数 LD_PRELOAD の有無のチェックのみであるが 少しの改造で上記のチェック処理を実現することは可能であろう ) 4. 検証作業者 NTT コミュニケーションズ株式会社 IT マネジメントサービス事業部ネットワークマネジメントサービス部セキュリティオペレーションセンター佐名木智貴 5. 参考 1. [Full-disclosure] FreeBSD zeroday http://lists.grok.org.uk/pipermail/full-disclosure/2009-february/067954.html 2. FreeBSD-SA-09:05.telnetd http://lists.freebsd.org/pipermail/freebsd-security/2009-february/005141.html 3. glibc LD_PRELOAD File Overwriting Vulnerability http://www.securityfocus.com/bid/2223 4. ld-linux.so LD_PRELOAD http://www.ca.com/jp/securityadvisor/vulninfo/vuln.aspx?id=405 5. Oracle LD_PRELOAD Privilege Escalation https://www.securinfos.info/english/security-advisoriesalerts/20031021_oracle_ld_preload_privilege_escalation.php 6. Libsafe を利用した Buffer Overflow 防止 http://www.bflets.dyndns.org/security/libsafe.html 7. セキュアなプログラマー : 入力に目を光らす http://www.ibm.com/developerworks/jp/linux/library/l-sp3/index.html 8. 環境変数 LD_PRELOAD 技術メモ帳 http://d.hatena.ne.jp/lurker/20060511/1147354551 9. Linux Intrusion Detection System FAQ 4.17. LIDS を使う時は LD_PRELOAD 環境変数に注意した方がいいですか? http://www.linux.or.jp/jf/jfdocs/lids-faq/ld-preload-warning.html 10. IPA ISEC セキュアプログラミング講座 7-3 setuid は慎重に http://www.ipa.go.jp/security/awareness/vendor/programming/b07_03_main.html 12

11. Articles:Izik : Reverse Engineering with LD_PRELOAD - security vulnerabilities database http://securityvulns.com/articles/reveng/ 12. リンクと同名のシンボル - bk ブログ http://0xcc.net/blog/archives/000060.html 13. ウノウラボ Unoh Labs: LD_PRELOAD を使って任意の関数呼び出しにフックしてみる http://labs.unoh.net/2008/04/ld_preload.html 14. Linux Function Interception http://uberhip.com/people/godber/interception/index.html 15. execv() http://www.linux.or.jp/jm/html/ldp_man-pages/man3/exec.3.html 16. environ http://www.linux.or.jp/jm/html/ldp_man-pages/man7/environ.7.html 17. getenv() http://www.linux.or.jp/jm/html/ldp_man-pages/man3/getenv.3.html 18. CREDENTIALS http://www.linux.or.jp/jm/html/ldp_man-pages/man7/credentials.7.html 6. 履歴 2009 年 02 月 20 日 : ver1.0 最初の公開 7. 最新版の公開 URL http://www.icto.jp/security_report/index.html 8. 本レポートに関する問合せ先 NTT コミュニケーションズ株式会社 IT マネジメントサービス事業部ネットワークマネジメントサービス部セキュリティオペレーションセンター e-mail: scan@ntt.com 以上 13