C/C++セキュアコーディング File I/O part1:UNIXの権限とパーミッション

Similar documents
ログを活用したActive Directoryに対する攻撃の検知と対策

PowerPoint プレゼンテーション

TFTP serverの実装

C/C++セキュアコーディング File I/O part2:ファイルシステムに関する脆弱性

2006年10月5日(木)実施

Prog1_12th

プレポスト【解説】

How_to_use_integritycheck

Apache ActiveMQ における認証処理不備の脆弱性

McAfee Application Control ご紹介

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

スライド 1

Symantec AntiVirus の設定

リスト 1 1 <HTML> <HEAD> 3 <META http-equiv="content-type" content="text/html; charset=euc-jp"> 4 <TITLE> 住所の検索 </TITLE> 5 </HEAD> 6 <BODY> <FORM method=

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2

TOMOYO Linux の概要

JBoss Application Server におけるディレクトリトラバーサルの脆弱性

制御システムセキュリティアセスメントサービス

使用する前に

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

UCCX ソリューションの ECDSA 証明書について

1. 対象装置 (1) 日立仮想 Fibre Channel アダプタ 適用装置 : EP8000 7xx 2. 仮想 FC アダプタドライバ来歴 この仮想 FC アダプタドライバは 次の機能拡張とバグ修正を含みます バージョン内容 新規追加 AIX ロ

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

SSL サムプリントの検証 SSL サムプリントの検証はリモートユーザーがホストの信頼性を検証するために使用します この検証はリモートとホスト間の接続の安全性を確立して MITM 攻撃から保護するために実行する必要があります デフォルトで リモートユーザーが TCP/IP を使用してホストに接続しよ

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

<4D F736F F D2089E696CA8F4390B35F B838B CA816A>

Troubleshooting SSH connections with Reflection X

ファイルシステム

04-process_thread_2.ppt

OSSTechプレゼンテーション

TOMOYO Linuxを体験しよう

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

PowerPoint Presentation

NortonAntiVirus for MicrosoftExchange

※ ポイント ※

slide4.pptx

Microsoft PowerPoint - InfPro_I6.pptx

TRAVENTY CG V 動作検証報告書

IPM Release 2.6 へのアップグ レード

FTPサーバーへのアクセス権限設定

Windows GPO のスクリプトと Cisco NAC 相互運用性

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

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

<4D F736F F D20B6BCB5D7B2CCDED7D8CFC6ADB1D9315F43532E444F43>

PowerPoint Presentation

Red Hat Enterprise Linuxのcron(8)デーモンにデフォルト定義されたtmpwatch命令の動作による、WebOTXのトラブル対処方法

Microsoft Word - WE-InstMan382J sol.doc

V-CUBE One

SOC Report

Windows 10の注意点

Spacewalkにおけるクロスサイトフォージェリ(CSRF)の脆弱性

VNX ファイル ストレージの管理

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

ファイル入出力

目次 1. ユーザー登録 ( 初期セットアップ ) を行う Office365 の基本的な動作を確認する... 6 Office365 にログインする ( サインイン )... 6 Office365 からサインアウトする ( ログアウト )... 6 パスワードを変更する... 7

はじめての暗号化メール(Thunderbird編)

演算増幅器

TOMOYO Linux

各種パスワードについて マイナンバー管理票では 3 種のパスワードを使用します (1) 読み取りパスワード Excel 機能の読み取りパスワードです 任意に設定可能です (2) 管理者パスワード マイナンバー管理表 の管理者のパスワードです 管理者パスワード はパスワードの流出を防ぐ目的で この操作

1. Office365 の Web メール Office365 の Web メールは 電子メール操作をブラウザソフトで利用できるようにしたもので パソコンやスマートフォンから 学内外を問わず利用できます 2. 利用上の制約事項 2-1 送受信メールサイズ制限 項目 制限値 1 通あたりの送信メール

PowerPoint Presentation

PASSEXAM

目次 1 環境 バージョン インストール環境 インストール手順 前提条件 CentOS SSHD の設定 VSFTPD の設定 コンテンツ管理 CGI のイ

CLUSTERPRO MC StorageSaver istorage M シリーズ使用時の設定手順 (HP-UX 版 Linux 版 Windows 版 ) 2013(Sep) NEC Corporation istorage M シリーズを使用する場合の StorageSaver 設定手順 (H

ファイル入出力

1. 対象装置 (1) 日立仮想 Fibre Channel アダプタ 適用装置 : EP8000 7xx/S8xx/E8xx/S9xx 2. 仮想 FC アダプタドライバ来歴 この仮想 FC アダプタドライバは 次の機能拡張とバグ修正を含みます バージョン内容 新規追加 7

CONTEC DIOプロバイダ ユーザーズガイド

Linkexpress トラブル初期調査資料 採取コマンド使用手引書

在学生向けメールサービス

拓殖大学総合情報センター 学生 Web メール (Office365) 操作マニュアル 目 次 1. Office365 の Web メール 2 2. 利用上の制約事項 送受信メールサイズ制限 メールボックス利用制限 2 3. Office365 のサインイン サインアウト

二次元連続動的計画法による知的画像処理システム ImageFileSelector RTC 機能仕様書 ImageFileSelectorRTC Ver.1.0 ( 株 ) 東日本計算センター 1 / 11

PowerPoint Presentation

Veritas System Recovery 16 Management Solution Readme

SlinkPass ユーザマニュアル

JEB Plugin 開発チュートリアル 第4回

Microsoft Word - WebMail.docx

スライド 1

X-MON 3.1.0

スライド 1

PowerPoint Presentation

VNX ファイル ストレージの管理

slide5.pptx

ファイル メニューのコマンド

SpreadSheet Interface

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

管理アカウントの TACACS+ 認証をサポートするための Cisco VPN 3000 コンセントレータの設定方法

5400 エミュレーターII 構成の手引き(第6章 トラブルシューティング)

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

Shareresearchオンラインマニュアル

Q-Chem 5.2 Linux OS へのオンラインインストール 2019 年 6 月 24 日 Q-Chem 5.2 のインストール Linux OS へのオンラインインストール ( 推奨 ) ( 株 ) アフィニティサイエンス 概要 :Linux OS へのインストールには, オンラインインス

[ 証明書の申請から取得まで ] で受領したサーバ証明書を server.cer という名前で任意の場所に保存してください ( 本マニュアルではローカルディスクの work ディレクトリ [C:\work] に保存しています ) 中間 CA 証明書を準備します 次の URL にアク

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

============================================================

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

スケジューリングおよび通知フォーム のカスタマイズ

Monthly Research / セキュアハードウェアの登場とその分析

■POP3の廃止について

第 3 回情報基礎演習 UNIX / Linux: ファイルシステム シェルを理解しよう! 谷口貴志 Panda に login し 情報基礎演習クラスの VDI から Ubuntu に接続し Linux に login した後, 左 上の Activity 端末のアイオン をクリック 端末 を立ち

プログラミング基礎

Transcription:

Japan Computer Emergency Response Team Coordination Center 電子署名者 : Japan Computer Emergency Response Team Coordination Center DN : c=jp, st=tokyo, l=chiyoda-ku, email=office@jpcert.or.jp, o=japan Computer Emergency Response Team Coordination Center, cn=japan Computer Emergency Response Team Coordination Center 日付 : 2010.03.23 17:54:51 +09'00' C/C++ セキュアコーディング File I/O part1 UNIXの権限とパーミッション 2010年3月23日 JPCERTコーディネーションセンター

File I/O part1: UNIX の権限とパーミッション Part 1 パーミッションと権限 ユーザ識別所有者権限パーミッション プロセスの権限 権限の変更と管理 パーミッションの管理 脅威の緩和方法 Part 2 ディレクトリトラバーサル ファイルシステムのおさらい ファイルパス シンボリックリンクとハードリンク ディレクトリトラバーサ chroot(), jail() Part 3 Race Condition 並列処理 競合状態 排他制御 デッドロック ロックファイルとファイルロック ファイルシステムへの攻 脅威の緩和方法 ここ UNIX POSIX 2

本モジュールのゴール 以下を理解 習得すること : UNIXにおける権限管理 ファイルI/Oにまつわる危険 安全なファイルI/Oのためのノウハウ 3

目次 ユーザ ファイル プロセス権限の変更権限の管理ファイルパーミッションの管理脅威の緩和方法まとめ 4

C/C++ とファイル入出力 ファイル入出力はOS 環境の権限管理のもとに行われる C/C++ 言語仕様は 特定のファイルシステムに依存しないよう設計されている OS やファイルシステムによって権限管理モデルは異なる. 例えば Unix UFS や NFS(v3) OS のユーザ権限およびファイルパーミッション AFS(Andrew File System) や DCE/DFS ユーザ権限および ACL( アクセスコントロールリスト ) セキュアなプログラムをつくるために知っておくべきこと 言語仕様上の問題点とその対策について 動作環境における問題点とその対策について このセミナーでは POSIX 環境を前提として話をします. 5

UNIX 環境におけるユーザ管理 複数のユーザが OS 環境を使う ユーザやプログラムが 他ユーザやシステムのデータを故意に ( あるいは無意識に ) 変更できないように権限管理 必要に応じてユーザプロセスに特権を与える仕組みがある (set*id 関数 ) ユーザの識別 : ユーザ ID(UID) とユーザ名 /etc/passwd UID = 0 (root) はすべてのファイルにアクセスできる特別な存在ユーザ認証 : パスワード /etc/passwd /etc/shadow /etc/master.passwd などグループ : グループ ID(GID) とグループ名 /etc/group 全てのユーザはなんらかのグループに属する (initial group, supplementary groups) 6

UNIX ファイルシステムのファイルと権限 - 各ファイルには以下のような属性情報がついている - 所有者 (UID) - グループ (GID) リスト - permission ( 所有者が設定する 所有者あるいは root だけが変更可能 ) 対象 : 所有者 (User) グループ (Group) その他のユーザ (Others) アクセス : 読み取り (Read) 書き込み (Write) 実行 (execute) setuid ビット setgid ビット スティッキービット 7

UNIX のファイルパーミッション (1) -rwsr-xr-x 1 root root 28480 Feb 27 2007 /usr/bin/passwd -rwxr-xr-x 1 root root 258896 Sep 16 2008 /usr/bin/ssh -rwxr-sr-x 1 root tty 10456 Dec 22 2007 /usr/bin/wall -rwxr-x--- 1 yozo yozo 1288172 Dec 19 2008 /home/yozo/bin/ssh lrwxrwxrwx 1 root root 13 Feb 29 2008 /etc/motd -> /var/run/motd drwxrwxrwt 73 root root 16384 Oct 14 19:02 /tmp ファイルの種類 : 通常ファイル - ディレクトリ d シンボリックリンク l デバイス b/c ソケット s fifo f/p permission: r w x s (set*id) t( スティッキー ) 8

UNIX のファイルパーミッション (2) ファイルのアクセス制御は プロセスの実効ユーザ ID (EUID) や実効グループ ID (EGID) を 対象ファイルの UID/GID と比較して行われる -rwxr-x--- 1 yozo staff 1288172 Dec 19 2008 /home/yozo/bin/ssh 所有者 (UID) グループ (GID) ユーザ yozo のプロセスは読み / 書き / 実行が可能 グループ staff のプロセスは読み / 実行が可能 それ以外のプロセスは読み / 書き / 実行すべて不可 9

UNIX のプロセスと権限 各プロセスは以下のような属性情報を持っている プロセス ID 親プロセス ID 所有者 (UID) グループ (GID) リスト cwd(current working directory) 環境変数リスト など カーネルは UID,GID に基づきプロセスのアクセス制御を行う 10

プロセスが持つ三つのユーザ ID( とグループ ID) 各ユーザ ID は親のユーザ ID からコピーされるのが基本 Real UID(RUID) Effective UID(EUID) カーネルがプロセスに対するパーミッションを決定する際に参照する setuid プログラムの実行時には実行ファイルの所有者 ID Saved-set-UID(SUID) setuid プログラムの実行時には実行ファイルの所有者 ID グループ ID についても同様 ただし supplementary group list があり EGID とともにアクセス制御に使われる 11

プロセスの生成 UNIX 環境においてコマンドが実行されるときの動作 : fork() によってプロセスをコピー ( 子プロセスの生成 ) exec() 系システムコールによってコマンドを実行 生成された子プロセスは 親プロセスの属性を継承する RUID RGID EUID EGID など 補助グループ ID 12

通常プログラムの実行 RUID 25 所有者 18 -rwxr-xr-x 所有者 25 -rw-r--r-- ファイル 読み / 書き ; ; exec( ); プログラム 所有者 25 -rw-r--r-- ファイル 読み / 書き ; ; ; RUID 25 EUID 25 13

setuid ファイルモードビット 一般ユーザが別の権限で作業をするための仕組み set-user-id-on-execution ビット (S_ISUID) setuid ビットが設定された実行可能ファイルを実行すると 起動されたプロセスはファイル所有者の権限を持つ ( つまり 新しいプロセスの EUID と saved set-user-id はファイルの所有者 ID の値となる ) set-group-id-on-execution ビット (S_ISGID) setgid ビットの設定された実行可能ファイルを実行すると 起動されたプロセスはファイルのグループの権限を持つ ( つまり 新しいプロセスの EGID と saved set-group-id はファイルのグループ ID の値となる ) 14

setuid プログラムの実行 所有者 25 -rw-r--r-- ファイル 読み / 書き RUID 25 ; ; exec( ); 所有者 18 -rwsr-xr-x プログラム setuid ビットが設定されていると EUID はそのファイルの所有者に設定される 所有者 18 -rw-r--r-- ファイル所有者 25 -rw-r--r-- ファイル 読み / 書き 読み / 書き ; ; i=getuid(); seteuid(i); ; ; RUID 25 EUID 18 SSUID 18 RUID 25 EUID 25 SSUID 18 15

saved set-user-id saved set-user-id 機能により プログラムは最後の exec() の呼び出し時に設定された EUID を取り戻せる さもなければ 同じ関数を実行するためにプログラムはスーパーユーザとして実行しなければならない 同様に saved set-group-id 機能により プログラムは最後の exec() の呼び出し時に設定された EGID を取り戻すことができる 永久に権限を破棄するには EUID を RUID に設定する こうすることで昇格した権限は新しいプログラムに渡されない 16

目次 ユーザ ファイル プロセス権限の変更権限の管理ファイルパーミッションの管理脅威の緩和方法まとめ 17

権限の変更 スーパーユーザ権限を持つプロセスは 通常ユーザの権限を永久に あるいは 一時的に適用することが必要な場合がある スーパーユーザの権限を持っていないプロセスは RUID と saved set-user-id の間の切り替えが必要な場合がある 一時的な権限の破棄は ファイルにアクセスする際に役立つ 権限は取り戻すことができるため 任意のコードの実行を許可する脆弱性 ( バッファオーバーフローなど ) の影響の制限にはならない 18

最小権限の原則 プロセスが昇格した権限で実行しており 共有ディレクトリやユーザディレクトリのファイルにアクセスする場合は EUID を RUID ( プロセスを実行したユーザの ID) に設定すべし オペレーティングシステムの権限モデルを活用 ユーザによる許可されていない操作を防止 それでもなお AFS など異なる権限モデルを使うファイルシステムでは プログラムの安全性は十分でない可能性がある 19

権限に関する脆弱性の例 FreeBSD 4.4( およびそれ以前 ) に含まれている OpenSSH は スーパーユーザ権限で動作するが ファイルを開く前に常に権限を破棄するとは限らない : fname = login_getcapstr(lc, copyright,null,null); if (fname!= NULL && (f=fopen(fname,"r"))!= NULL) { while (fgets(buf, sizeof(buf), f)!= NULL) fputs(buf, stdout); fclose(f); } 攻撃者は ~/.login_conf ファイルに細工しておくことで ファイルシステムの任意のファイルを読み取ることができる : copyright=/etc/passwd 参考 : FreeBSD-SA-01:63 20

許可される変更 プロセスは EUID を次の ID に変更できる Real UID( プログラムを起動したユーザ ) Saved Set-User-ID これによりプロセスは 権限の切り替えが可能になる スーパーユーザ権限を持つプロセスは あらゆる操作を実行できる 21

権限変更のための関数 プロセスが持つ 3 つのユーザ ID の操作に使用する関数 seteuid() setuid() setreuid() setresuid() これらの関数は 異なるバージョンの UNIX 上では異なるセマンティクスを持つため アプリケーションを移植する際にセキュリティ上の問題につながる可能性がある ( 参考 : Setuid Demystified. http://www.cs.berkeley.edu/~daw/papers/setuid-usenix02.pdf) 22

seteuid(),setuid(),setreuid(),setresuid() プロセスの EUID を変更する int seteuid(uid_t euid); スーパーユーザ権限で実行中のプロセスは EUID を任意の値に設定できる 一般ユーザプロセスは EUID を RUID または SSUID にのみ設定できる setegid() 関数は グループ ID に対し 同様の動作をする 23

seteuid() の例 Admin(UID=1000) というユーザが binユーザ (UID = 1) 所有の setuid ビットが設定されたファイルを実行した場合 プログラムは 起動時には次のユーザ ID を持つ RUID 1000(admin) EUID 1(bin) SSUID 1(bin) 権限を一時的に手放すには seteuid(1000) を呼ぶ RUID 1000(admin) EUID 1000(admin) SSUID 1(bin) 権限を取り戻すには seteuid(1) を呼ぶ RUID 1000(admin) EUID 1(bin) SSUID 1(bin) 24

seteuid(),setuid(),setreuid(),setresuid() プロセスの EUID を変更する int setuid(uid_t uid); setuid() 関数は主に 権限を永久に破棄する目的で使われる 動作にはバリエーションがあり 過去のさまざまな実装の動作が反映されている setuid() 関数よりも seteuid() 関数を使うように心がけるべき. 25

POSIX.1-1990 における setuid() の動作 呼び出し元に 適切な権限 がある場合 setuid() は呼び出し元プロセスの以下を設定する Real UID EUID saved set-user ID 適切な権限 がない場合には EUIDのみ設定する setuid ビットを設定してインストールされ RUID を使って操作を実行する必要のあるアプリケーションに必要 たとえば lpr は権限付きの操作を実行するために昇格した EUID を必要とするが ジョブはユーザの実際の RUID で印刷される 26

setuid() の動作の相違 適切な権限 とは? Solaris: EUID=0 ( すなわち プロセスが root として実行している ) Linux: プロセスに CAP_SETUID 機能がある ( 参考 :capabilities(7)) EUID が {0,RUID,SSUID} と等しくない場合 setuid(geteuid()) は失敗する BSD: 全てのユーザが常に 適切な権限 を持っている 27

setuid() の複雑性 Linux の例 28

seteuid(),setuid(),setreuid(),setresuid() RUID と EUID を 引数 ruid と euid で指定された値に設定 int setreuid(uid_t ruid, uid_t euid); ruid または euid が -1 の場合 当該ユーザ ID は変わらない 適切な権限を持つプロセスは両方の ID を任意の値に設定できる 権限のないプロセスは euid 引数がプロセスの RUID EUID または SSUID と等しい場合に EUID のみ設定できる 適切な権限のないプロセスが RUID を プロセスの現在の RUID EUID SSUID のいずれかに変更できるかどうかは不定 29

seteuid(),setuid(),setreuid(),setresuid() RUID EUID SSUID を明示的に設定する int setresuid(uid_t ruid, uid_t euid, uid_t suid); ruid, euid または suid が -1 のとき 当該ユーザ ID は不変 スーパーユーザはこれらの ID を任意の値に設定できる 権限のないユーザは ID のいずれかを現在の ID のいずれかの値に設定できる setresuid() には明確なセマンティクスがあり さまざまな系統の UNIX(Linux FreeBSD HP-UX OpenBSD3.3 以降 ) において同じ方法で実装されている 30

目次 ユーザ ファイル プロセス権限の変更権限の管理ファイルパーミッションの管理脅威を緩和する方法まとめ 31

setuid および setgid プログラム setuid プログラム : set-user-id-on-execution ビットが設定されているもの setgid プログラム : set-group-id-on-execution ビットが設定されているもの setuid プログラムは root (set-user-id-root) として または root 以外のより制限された権限での実行に使われる 32

setuid root プログラム setuid-root が必要な例 :passwd ping $ ls -l /usr/bin/passwd -r-sr-xr-x 1 root bin [...] /usr/bin/passwd $ ls -l /sbin/ping -r-sr-xr-x 1 root bin [...] /sbin/ping 33

root 以外の setuid および setgid プログラム 通常は 制限されたあるいは特定のタスクの実行に使われる これらのプログラムは EUID を RUID や SSUID にある値にのみ変更できる システム設計上 root に set-user-id することは可能な限り避けるべき 34

例 : wall プログラム 各ユーザの端末デバイスにメッセージを書き込むことにより システムの全ユーザにメッセージを一斉配信する 相互の覗き見や他人の端末セッションの妨害を防ぐため root 以外の通常ユーザは 他人の端末デバイスに直接的には書き込めない wall プログラムはsetgidを活用して一斉配信を実現している wall は setgid-tty としてインストールされ tty グループのプロ セスとして実行される -r-xr-sr-x 1 root tty [...] /usr/bin/wall 端末デバイスは グループによる書き込みが可能 crw--w---- 1 usr1 tty 5, 5[...] /dev/ttyp5 35

setuid プログラムに関する注意 1 setuid プログラムは ファイルの所有者に許可されているすべての操作を実行できる (setuid-root では root が実行できるすべて ) setuid プログラムでは以下を行わないように注意する 信頼できないユーザに対する操作信頼できないユーザへの機密データの受け渡し最小権限の原則 root 権限が不要になったら EUID を変更すること setuid シェルスクリプト ( 避けるべき ) 競合状態 : setuid プログラムの実行を開始し プログラムがロードされ実行される前にその内容を変更される危険性 いずれにしても一部のシステムは シェルスクリプトの setuid ビットを無視する 36

setuid プログラムに関する注意 2 setuid プログラムの動作環境では 以下のような情報はユーザによって操作されている可能性があることを考慮すべし : ファイル記述子 引数 環境変数 cwd tty リソース制限 タイマーとシグナル UNIX のバージョンによっては 制御される項目のリストが異なるため すべてのOS 環境に対応する移植性のあるコードを記述するのは難しい Locally exploitable な脆弱性の攻撃で悪用される 37

メール転送エージェントに要求される権限管理とは? 以下を行うメール転送エージェント (MTA) の権限管理について考察せよ ( 信頼できない ローカルおよびリモートの ) ユーザからメッセージを受信する 受け取ったメッセージを宛先ユーザの受信箱 ( 宛先ユーザが所有するファイル ) へ配信する ローカルユーザからメッセージを受け取り送信先に配送する 各メッセージを送信した UID( および GID) にもとづきアクセス制御し ログファイルに動作を記録する 38

メール転送エージェントの実装 ユーザが所有する受信箱へ書き込むために root 権限で実行する必要がある 受信箱への書き込み時は一時的に通常ユーザの ID で動作するのが安全 Sendmail, postfix, exim など著名な MTA がどのような実装をしているか 調べてみよう! 39

権限の放棄と復元 権限を一時的に破棄するには 特権をもつ UID を EUID から削除し SSUID に格納する 後で SSUID から復元できる 権限を復元するには EUID を SSUID にセットするきUIDの場合 ) (SSUID が権限つ 権限を永久に破棄するには 特権をもつ UID を EUID と SSUID の両方から削除する 昇格した権限はもう復元できない! 40

権限の放棄と復元 権限を一時的に破棄するには 特権 UID を SSUID にコピーし EUID には一般権限の ID をセットする 特権 ID は後で SSUID から復元できる 権限を復元するには SSUID にコピーしておいた ID を EUID にセットする 権限を永久に破棄するには 特権 UID を EUID と SSUID の両方から削除する 昇格した権限はもう復元できない! 41

一時的に権限を降格する /* 制限された操作を実行する */ setup_secret(); uid_t uid = /* 特権のないユーザ ID*/ /* 権限を一時的に uid に降格する */ if (setresuid( -1, uid, geteuid()) < 0) { } /* エラー処理 */ /* 普通の処理を続ける */ some_other_loop(); 42

権限を復元する /* 特権のない操作を実行する */ some_other_loop(); /* 降格した権限を復元する SSUID に特権 id がはいっている */ uid_t ruid, euid, suid; if (getresuid(&ruid, &euid, &suid) < 0) { /* エラー処理 */ } if (setresuid(-1, suid, -1) < 0) { /* エラー処理 */ } /* 特権の必要な処理を続ける */ setup_secret(); 43

権限を永久に降格する /* 制限された動作を行う */ setup_secret(); /* 権限を永久に破棄する RUID には特権がないと仮定 */ if (setresuid(getuid(), getuid(), getuid()) < 0) { /* エラー処理 */ } /* 通常の処理を続ける */ some_other_loop(); 44

グループ権限 setgid(),setegid(),setresgid() は setuid(),seteuid(),setresuid() に似たセマンティクスだがグループ ID に対して動作する プログラムによっては set-user-id-on-execution ビットと setgroup-id-on-execution ビットの両方が設定されている set-group-id-on-execution ビットのみ設定されていることの方が多い 45

グループ権限を破棄する 1 プログラムに set-user-id-on-execution ビットと set-group-id-onexecution ビットの両方が設定されている場合 グループ権限の破棄を忘れずに /* 制限された操作を実行 */ setup_secret(); uid_t uid = /* unprivileged user */ gid_t gid = /* unprivileged group */ /* 権限を一時的に uid と gid 降格 */ if (setresgid( -1, gid, getegid()) < 0) { /* エラー処理 */ } if (setresuid( -1, uid, geteuid()) < 0) { /* エラー処理 */ } /* 通常の処理を続ける */ some_other_loop(); 46

グループ権限を破棄する 2 つぎの例は 間違った順序で権限を破棄している if (setresuid( -1, uid, geteuid()) < 0) { /* エラー処理 */ } if (setresgid( -1, gid, getegid()) < 0) { /* EUID はもう 0 ではないので失敗するかも */ } EGID が 0 でも EUID が root 権限とは限らない setresgid() の実行結果は OS に依存する また 補助グループの権限も必ず破棄すること /* int setgroups(int ngroups, const gid_t *gidset); */ setgroups(0, NULL); 47

権限管理を誤ったときの被害 特権を持つプログラムにおいて権限管理を誤ると 本来アクセス権のなかったファイルを攻撃者に操作される可能性がある 考えられるシナリオ : 特権ファイルを読む ( 情報漏洩 ) ファイルの切り捨て ファイルにデータを追加 ファイルの permission を変更する マシンを完全に制御する 48

目次 ユーザ ファイル プロセス権限の変更権限の管理ファイルパーミッションの管理脅威を緩和する方法まとめ 49

ファイルパーミッション プロセス権限の管理は方程式の半分 残りの半分はファイルパーミッションの管理 ファイルパーミッションの管理は 一部はシステム管理者の責任であり 一部はプログラマの責任 50

FIO01-C. ファイル名でファイル識別する関数の使用に注意 C99 の以下の標準関数はファイル名だけに頼ってファイルを識別するので危険 remove(), rename(), fopen(), freopen() ファイルに ( 繰り返し ) アクセスするとき ファイル名ではなく ファイルディクスリプタや FILE ポインタでアクセスする方が確実 51

セキュアコーディング例 char *file_name; FILE *f_ptr; /* file_nameを初期化 */ f_ptr = fopen(file_name, "w"); if (f_ptr == NULL) { /* Handle error */ } /*... */ if(chmod(file_name, S_IRUSR)==-1) { /* エラー処理 */ ファイル名で改め } てファイルにアクセスしている char *file_name; intfd; /* file_nameを初期化 */ fd = open( file_name, O_WRONLY O_CREAT O_EXCL, S_IRWXU); if (fd == -1) { /* エラー処理 */ } /*... */ if (fchmod(fd, S_IRUSR) == -1) { /* エラー処理 */ } POSIXの open(),fchmod() を使うことで同一のオブジェクトに対して操作 52

書き込み可能なディレクトリの落とし穴 特定のユーザがディレクトリに書き込み可能な場合 そのユーザはディレクトリ内にあるディレクトリとファイルの名前を変更できる 極秘データを収めたファイルをディレクトリ /home/myhome/stuff/securestuffに保存したとして どこかのユーザAが /home/myhome/stuff に書き込み可能だったら ディレクトリ securestuff を別の名前に変更するかも 極秘データが入ったファイルにアクセスできなくなる! 53

例 : sendmail sendmail は読み書きするファイル ( 設定ファイルなど ) のモードをチェックし 例えば次のようなファイルの読み取りは拒否する グループによる書き込みが可能なファイル 所有者以外のユーザによって改ざんされている可能性があるため グループによる書き込みが可能なディレクトリのファイル /etc/mail/aliases /etc/mail/sendmail.cf など 54

セキュアなディレクトリ 1 セキュアなディレクトリ : ユーザ自身と管理者以外はファイルの作成 リネーム 削除などの操作ができないディレクトリ 他のユーザでもファイルを読んだりディレクトリを検索したりはできるが ディレクトリのコンテンツは変更できない セキュアディレクトリの親ディレクトリなど上位のディレクトリにあるファイルを 他のユーザが削除したりリネームしたりできてはならない セキュアなディレクトリでファイルを操作すれば ファイルやファイルシステム改ざんによる攻撃を排除できる 55

セキュアなディレクトリ 2 ファイル名とファイルの実体との間には弱い結びつきしかない そのため脆弱性がつくりこまれやすい ( 参考 :FIO01-C. ファイル名でファイル識別する関数の使用に注意 ) セキュアなファイル操作が可能ならば 必ずそうすべき セキュアなファイル操作が困難な場合 セキュアなディレクトリ上でファイルを操作するようにデザインする 56

セキュアなディレクトリ 3 セキュアなディレクトリを作成するには 対象ディレクトリの上位のパスがすべて以下の条件を満たす必要がある : 当該ユーザかスーパーユーザによって所有されている それ以外のユーザには書き込み権限がない 上位のディレクトリが他のユーザによって削除されたりリネームされないようにすること ルートから末端までのディレクトリをくまなく精査し 攻撃者がそのいずれかのディレクトリをリネームしたり再作成できるような危険な競合状態 (race condition) を避ける 57

セキュアなファイルを作成するには パーミッションを所有者のみに限定 fopen() や mkstemp() などの関数でファイルを作成する前に umask() を呼び出して適切なパーミッションを設定する 58

umask1 UNIX では プロセスごとに umask 値を持っており ファイルやディレクトリを新規作成する場合にその umask が使用される umask は ファイルを作成するときにシステムコールに引数として指定されたビットをマスクする umask のビット == 許可したくないビット 次の関数の呼び出し時に渡された mode 引数の許可ビットを無効にする : open() creat() mkdir() mkfifo() chmod() と fchmod() は umask の設定の影響は受けない 59

umask2 オペレーティングシステムは umask の反転値とプロセスから要求されたパーミッションのビット毎の & を計算することによってアクセスパーミッションを決定する 所有者グループその他 モード 777 1 1 1 1 1 1 1 1 1 & ~(umask 022) 1 1 1 1 0 1 1 0 1 = ファイルパーミッション 755 1 1 1 1 0 1 1 0 1 60

umask3 プロセスは 親プロセスから umask の値を継承する 典型的には シェルはユーザのログイン時に以下の umask 値をデフォルトとして設定する 022(group, world の writable bit を無効にする ) 02(world の writable bit を無効にする ) ユーザは umask 値を変更できる ユーザが設定した umask 値は決して信用するな!! 61

fopen() を使用したファイルの作成 1 C99 の fopen() 関数を使って新しいファイルを作成する場合 パーミッションは指定できない デフォルトで 0666 が設定される この動作を変更する唯一の方法は 次のどちらか : fopen() の呼び出し前に umask を設定 ファイル作成後に fchmod() でパーミッション変更 ファイル作成後のパーミッション変更は 競合状態が生じるため避けるべき ファイルが作成されてからパーミッションが変更されるまでの間に 攻撃者がファイルにアクセスする可能性がある 62

fopen() を使用したファイルの作成 2 正しい解決策は ファイルの作成前に umask を変更することである mode_t old_umask = umask(~s_irusr); FILE *fout = fopen("fred", "w");... fclose(fout); fopen() は C99 の関数 umask() は POSIX の関数 この 2 つの関数間のやり取りを定めた規格はない 必ず使用するプラットフォームでテストすること! 0400 になる mkstemp() のいくつかのバージョンは同じ方法で umask とやり取りする 63

POSIX の open() 関数 POSIX の open() 関数には ファイルの作成時に使うパーミッションを指定する オプションの第 3 引数がある fd = open("fred", O_WRONLY O_CREAT, S_IRUSR); fredという名前のファイルを 書き込み専用で新規作成し パーミッションをユーザの読み取り許可に指定している 64

目次 ユーザ ファイル プロセス権限の変更権限の管理パーミッションの管理脅威を緩和する方法まとめ 65

まずは set*uid 関数は使わないで済ませましょう! 出典 : UNIX& インターネットセキュリティ Simson Garfinkel Gene Spafford オライリー ジャパン 1998 66

推奨事項のリスト setresuid() を使う seteuid() を使う戻り値の状態をチェックする昇格した権限はなるはやで破棄する権限を分離する 67

setresuid() を使う setresuid() 関数は 3 つの UID すべてを設定し 成功したら 0 を エラーが発生したら -1 を返す すべての UID 関数の中で最も移植性が高い Linux と BSD で使用可能 Solaris では使用できない すべての UID 関数の中ではセマンティクスが最も簡潔 3 つの UID すべてを指定された値に明示的に設定する 1 つか 2 つだけ設定することはなく 必ず設定しないか 3 つすべてを設定する EUID=0 の場合 または各引数が 3 つの UID 値のいずれかと一致する場合に常に成功する 68

seteuid() を使う seteuid() 関数は 単に EUID を設定する setresuid() よりも移植性が高い Linux BSD Solaris で使用可能 セマンティクスは setresuid() とほぼ同じ程度に簡潔 EUID を設定する RUID や SUID には影響しない EUID=0 の場合常に動作する EUID が 0 でなければ Linux と Solaris では 新しい EUID が実行前の 3 つの UID のいずれかと一致すれば動作する BSD では 新しく設定する EUID が実行前の RUID または SSUID と一致すれば動作する 69

戻り値をチェックする 各 set*uid 関数は 成功した場合 0 を返す 失敗した場合は -1 を返し 適切な errno を設定 set*uid 関数の戻り値が 0 であることを確認せよ さらに setuid プログラムを移植する場合には getuid() や geteuid() などを使って UID 値が正しく設定されていることを確認するとよい 70

昇格した権限は可能な限り破棄する 昇格した権限を一時的 / 永久に破棄することで プログラムは 権限を持たないユーザと同じ制限に従ってファイルにアクセスする ユーザがパーミッションのないはずの操作を行うことを防止する しかし 以下のような欠点もある 任意のコード実行を可能にするような脆弱性 ( 例えばバッファオーバーフロー ) の影響は防げない 一時的に権限を破棄しているだけなら 特権を復元できる 71

権限を分離する 1 永遠の課題 setuid プログラムは可能なかぎり単純にすべき 注意して使っていても失敗する可能性がある 時として予期しない方法で 72

権限を分離する 2 権限を一時的 / 永久に破棄するかわりに 特権を持つ親プロセスと権限を制限した子プロセス間のインターフェイスを定義し プロセス毎に権限を分離するという方法もある 子は権限を必要とする処理を親に委任する プロセス間のやり取りは パイプを通じて行う 他の手段でエクスポートできない場合は共有メモリに保存 認証が成功したかどうかを判断するには 子プロセスは権限のある親プロセスに問い合わせる 73

権限分離の例 : OpenSSH 74

まとめ 不適切な権限管理は さまざまな脆弱性につながる 既存の API は 複雑 直感的でない 実装間で異なる 権限管理は細心の注意で!! キーワードは 最小権限の原則 と 権限分離 75

参考文献 [Chen 02] Hai Chen, David Wagner & Drew Dean, Setuid Demystified. 11th USENIX Security Symposium, 2002. [Dowd 06] M. Dowd, J. McDonald & J. Schuh, The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities. Boston, MA: Addison-Wesley, 2006. See http://taossa.com for updates and errata. [Meunier 04] Pascal Meunier. CS390S: Canonicalization and Directory Traversal, November 2004. [MITRE 07] MITRE. Common Weakness Enumeration, Draft 7. October 2007. http://cwe.mitre.org/ [Howard 02] Michael Howard & David C. LeBlanc, Writing Secure Code, 2nd ed., Redmond, WA: Microsoft Press, 2002 (ISBN 0-7356-1722-8). [Viega 03] John Viega & Matt Messier, Secure Programming Cookbook for C and C++: Recipes for Cryptography, Authentication, Networking, Input Validation & More. Sebastopol, CA: O'Reilly, 2003 (ISBN 0-596- 00394-3). Simson Garfinkel, Gene Spafford UNIX& インターネットセキュリティ オライリー ジャパン 1998 76

オンラインの参考資料 Matt Bishop, Writing Safe Setuid Programs http://nob.cs.ucdavis.edu/%7ebishop/secprog/ Apple Secure Coding Guide, Avoiding Race Conditions and Insecure File Operations http://developer.apple.com/documentation/security/conceptual/ SecureCodingGuide/Articles/RaceConditions.html CWE-367 Time-of-check Time-of-use Race Condition http://cwe.mitre.org/data/definitions/367.html POSIX open() のマニュアル http://www.opengroup.org/onlinepubs/009695399/functions/open. html 77