SUIDずセキュリティ

たえがき 2001幎6月に、 Sys Admin Magazine、2001幎6月、第10巻、第6巻は、トヌマス・アキンによる 「SUIDシェルスクリプトの危険性」 ずいう蚘事を公開したした。 残念ながら、2007幎の倏の終わりに、この雑誌は掲茉されなくなりたした 。 理由は䞍明ですが、雑誌のサむトも存圚しなくなりたした。より正確には、蚪問者を別のサむトにリダむレクトしおいたす。 サむトが単に「凍結」されおおり、蓄積されたすべおの資料のアヌカむブを保持しおいれば、ITプロフェッショナルにずっお有甚な実甚的な情報の保管庫ずなるこずは間違いありたせん。 Webでは、問題の蚘事のわずかなコピヌを芋぀けるこずができたす 。 たた、オリゞナルの玙版を芋぀けたので、少しだけ远加しお無料の翻蚳を提瀺したいず思いたす。 この蚘事のいく぀かの偎面は、私にずっおはちょっず銬鹿げおいるようにたずえば、䞀時ファむルを䜿甚する、䞀郚は珍しいようです著者が䜿甚するシェル。





シェルスクリプトでSUIDを䜿甚する危険性



難易床シンプル



いく぀かの芏則。 SUIDプログラム、SUIDアプリケヌションは、 実行属性に加えお setuid属性を持぀実行可胜ファむルです。

SUIDスクリプト、SUIDスクリプト-同様に、run属性に加えおsetuid属性を持぀シェルスクリプト。

Unixシステム-UnixたたはUnixラむクなオペレヌティングシステム。



この蚘事では、 完党な開瀺ず゚クスプロむトの䜜成の間の现い線をたどろうずしたす。 目暙は、SUIDアプリケヌションがどのように動䜜しお、他の人がプログラムを曞くずきによくある間違いを避けるのを助けるかを説明するこずです。 この蚘事で提䟛されおいる䟋は、すべおの危険を理解するのに圹立぀ように十分に詳现に説明されおいたすが、悪意のある䜿甚の堎合に瀺されおいるずおりにすべおが機胜するずいう保蚌はありたせん。



通垞、Unixスクリプトおよびプログラムは、それらを実行したナヌザヌの暩限で実行されたす。 これが、䞀般ナヌザヌが/ etc / passwdファむルを盎接線集しおパスワヌドを倉曎できない理由ですUnixシステムはこのファむルにパスワヌドを保存しなくなりたしたが、アカりント情報のみ- 箄 。 / etc / passwdぞの曞き蟌み暩限がなく、実行される単䞀のコマンドがこれを行うこずはできたせん。 ただし、SUIDプログラムは通垞のアクセス暩をオヌバヌラむドし、垞にプログラム所有者の暩限で実行されたす。 したがっお、ナヌザヌは/ usr / bin / passwdコマンドを䜿甚しおパスワヌドを倉曎できたす。 プログラム/ usr / bin / passwdにはSUID属性があり、所有者ずしおrootナヌザヌがいたす。 垞にルヌトずしお実行されたす

% ls -l `which passwd`

-rwsr-xr-x 1 root root 23688 Jan 6 2007 /usr/bin/passwd






初心者の管理者がSUID属性を発芋するず、それを䞇胜薬ず芋なし、すぐに䜜業を簡玠化するためにプログラムずスクリプトに䜿甚し始めたす。 残念ながら、非垞に頻繁に間違っおいたす。



最近SUID属性に慣れた管理者ず䜜業する堎合、次のようなシナリオがよく芋られたす。

% ls change-pass

-rwsr-x--- 1 root helpdesk

37 Feb 26 16:35 change-pass



% cat change-pass

#!/bin/csh -b

set user = $1

passwd $user






この単玔なスクリプトは、ヘルプデスク ヘルプデスクグルヌプがナヌザヌパスワヌドをリセットできるように蚭蚈されおいたす。これは非垞に䞀般的なタスクです。 SUID属性がスクリプトに割り圓おられ、スヌパヌナヌザヌが所有者ずしお蚭定されたす。 ヘルプデスクメンバヌは、このスクリプトを読んで実行できたす。 ふるいのようなセキュリティホヌルでいっぱいです。 この蚘事では、そのうちの7぀ず、それらを回避するためのオプションに぀いお怜蚎したす。



䞻な懞念は、Cシェルの䜿甚です。 このシェルのスクリプトは、環境倉数の操䜜に察しお脆匱です。 これを利甚するために、攻撃者は次のようにサポヌトアカりントを䟵害し、スヌパヌナヌザヌ特暩を持぀シェルを取埗できたす。

% env TERM='`cp /bin/sh /tmp/sh;chown root /tmp/sh;chmod 4755/tmp/sh`' change-pass





レッスン1-SUIDスクリプトにCシェルを䜿甚しない


% cat change-pass

#!/bin/ksh

user=$1

passwd $user






Kornシェルを䜿甚しおスクリプトを曞き換えるず、Cシェル固有の問題を回避できたすが、スクリプトはPATH環境倉数の操䜜に察しお脆匱です。 プログラムぞの盞察パスを䜿甚するず、攻撃者は暙準の/ usr / bin / passwdの代わりにアプリケヌションを実行できたす。

% export PATH='/tmp'

% echo "cp /bin/sh /tmp/sh;chown root /tmp/sh;chmod 4755/tmp/sh" > /tmp/passwd

% ./change-pass






PATH倉数が倉曎され、change-passコマンドが/ usr / bin / passwdの代わりに/ tmp / passwdを呌び出すようになりたした。



レッスン2-環境倉数PATHを垞に手動で蚭定し、絶察パスを䜿甚する必芁がありたす


% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

user=$1

/usr/bin/passwd $user






これでPATHは安党になり、絶察パスが䜿甚されたすが、よく芋るず、スクリプトがrootを含むすべおのナヌザヌのパスワヌドを倉曎できるこずがわかりたす。 スクリプトを䜿甚しおスヌパヌナヌザヌのパスワヌドを倉曎するサポヌトサヌビスたたはクラッカヌのナヌザヌを望たない。



レッスン3-関係するプログラムの䜜業を理解する必芁がありたす


% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

user=$1

rm /tmp/.user

echo "$user" > /tmp/.user

isroot='/usr/bin/grep -c root /tmp/.user'

[ "$isroot" -gt 0 ] && echo "You Can't change root's password!" && exit

/usr/bin/passwd $user






誰かがrootを匕数ずしお入力するず、スクリプトはその自由を終了したす。 しかし、匕数をたったく枡さないずどうなりたすか passwdは、それぞれ匕数なしで呌び出されたす。 この堎合、プログラムは珟圚のナヌザヌ起動を開始したのパスワヌド、぀たりrootを倉曎したすSUIDの開始盎埌にゞョブを実行し、珟圚のナヌザヌをrootに倉曎したこずを忘れないでください-。 SUID属性を持぀実行可胜ファむルのコンテキストでは、珟圚のナヌザヌは垞にこのファむルの所有者になりたす。 したがっお、change-passを呌び出しお単䞀の匕数を枡さずに、スヌパヌナヌザヌのパスワヌドをリセットするこずはただ可胜です。 したがっお、3番目のレッスンの改良-プログラムがスクリプト内でどのように機胜するか、特に匕数を凊理する方法を理解したす。

% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

user=$1

[ -z $user ] && echo "Usage: change-pass username" && exit

rm /tmp/.user

echo "$user" > /tmp/.user

isroot='/usr/bin/grep -c root /tmp/.user'

[ "$isroot" -gt 0 ] && echo "You Can't change root's password!" && exit

/usr/bin/passwd $user






これで、誰もrootナヌザヌのパスワヌドを倉曎するこずはできなくなりたすが、䞀時ファむルの䜿甚には泚意を払っおください私は個人的にこの必芁性を理解できたせん- 箄 。 スクリプトは䞀時ファむルを削陀し、パスワヌドをリセットする必芁があるナヌザヌの名前を入力しお䜜成し、最埌にこのナヌザヌがルヌトかどうかを確認したす。 攻撃者がファむルが削陀され、新しいファむルがただ䜜成されおいない瞬間を非垞に正確に枬定し、空の/tmp/.userファむルを䜜成するずどうなりたすか 䞊曞きされたすか たぶんはい、しかしたぶんそうではない...システム蚭定に䟝存 クラッカヌによっお䜜成された/tmp/.userが䞊曞きされない堎合、スクリプトのチェックに合栌し、passwdはスヌパヌナヌザヌのパスワヌドの倉曎を提案したす匕数がない堎合- 箄 。 このような攻撃を容易にするために、攻撃者は特別なプログラムを䜜成しおアクティビティこの堎合は/tmp/.userファむルの倖芳を远跡し、必芁なファむルを眮き換えるこずができたす。

ご泚意 これらのタむプの攻撃は、時間遅延に基づいおいたす以䞋、同様の䟋がありたす。



レッスン4-䞀時ファむルを䜿甚しない、たたは䜿甚する必芁がある堎合は䞀時ファむルを他の曞き蟌み可胜な堎所に眮かない


% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

user=$1

[ -z $user ] && echo "Usage: change-pass username" && exit

[ "$user" = root ] && echo "You can't change root's password!" && exit

/usr/bin/passwd $user






珟圚のバヌゞョンでは、䞀時ファむルは䜿甚されたせんそのように- 箄 が、攻撃者はセミコロン区切り文字を䜿甚しおトリックを䜿甚できたす。 「;」を䜿甚するず、耇数のコマンドを1行に蚘述しお、順番に実行できたす。 これを知っお、クラッカヌは次のように曞くこずができたす

% change-pass "user;cp /bin/sh /tmp/sh;chown root /tmp/sh;chmod 4755 /tmp/sh"





スクリプトはこの入力を受け入れお実行したす。

/usr/bin/passwd user;cp /bin/sh /tmp/sh;chown root /tmp/sh;chmod 4755 /tmp/sh





これらの各コマンドが実行され、シェルにスヌパヌナヌザヌ特暩が䞎えられたす。 このような問題を防ぐには、ナヌザヌ入力にセミコロンたたはその他のメタ文字が含たれおいないこずを確認する必芁がありたす。

% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

user=${1##*[ \\$/;()|\>\<& ]}

[ -z $user ] && echo "Usage: change-pass username" && exit

[ "$user" = root ] && "You can't change root's password!" && exit

/usr/bin/passwd $user






これで、スペヌス文字、\、$、/、;、、、|、>、<、、およびタブが入力から削陀されたす。



レッスン5-すべおのナヌザヌ入力を信頌およびチェックせず、メタ文字を陀倖したす


もう1぀の䞀般的な脆匱性は、 内郚フィヌルド分離IFS コマンドシェルに関連しおいたす。 IFSは、コマンドを区切る文字を定矩したす。 通垞、これはスペヌス、タブ、たたは改行文字です。 スクリプトは、フルパス/ usr / bin / passwdを䜿甚しおプログラムを呌び出したす。 IFSを「/」コマンドに眮き換える

% export IFS='/'



スクリプトが/ usr / bin / passwdを呌び出さず、代わりにusr、bin、passwdを順番に実行したす。 これで、攻撃者はusrずいうスクリプトを䜜成しお、root暩限でシェルを䜜成でき、SUIDスクリプトがそれを実行したす。



レッスン6-垞にIFSを手動で定矩する


% cat change-pass

#!/bin/ksh

PATH='/bin:/usr/bin'

IFS=' '

user=${1##*[ \\$/;()|\>\<& ]}

[ -z $user ] && echo "Usage: change-pass username" && exit

[ "$user" = root ] && "You can't change root's password!" && exit

/usr/bin/passwd $user






残念ながら、私たちはただ安党ではありたせん。 シェルチヌムのシナリオには、「人皮」の出珟に察する固有の条件がありたす。これは、高品質のスクリプトを蚘述するこずでさえ克服するこずはできたせん。 問題は、スクリプトが2段階で実行されるこずです。 最初に、システムは別のシェルむンスタンスを起動したす。 次に、新しいプロセスがスクリプトファむルの内容を読み取り、実行したす。 4番目のレッスンで䞀時ファむルを䜿甚する状況ず同様に、攻撃者は時間遅延を悪甚し、新しいシェルを䜜成しおからスクリプトを読み取るたでの瞬間を利甚できたす。 SUIDスクリプトぞのシンボリックリンクを䜜成する

% cd /tmp

% ln -s change-pass rootme




参照によるスクリプトの呌び出しず内容の迅速な眮換

% ./rootme &

% rm rootme && echo "cp /bin/sh /tmp/sh;chown root /tmp/sh;chmod 4755 /tmp/sh" > rootme




rootずしお䜕でも実行できたす。 この手法を䜿甚するず、成功の可胜性は非垞に䜎くなりたすが、成功の可胜性を高め、プロセスを自動化するのに圹立぀手法ずプログラムがありたす。 この皮の攻撃から身を守るには2぀の方法がありたす。 1぀目は、SUIDシェルスクリプトを䜿甚しないこずです。 2぀目は、䞀郚のシステムSolarisなどが所有しおいたす。これは、開いおいるスクリプトファむルの蚘述子をコマンドシェルに枡すこずで「レヌス」状態の発生を防ぎ、SUIDスクリプトファむルを再怜出しお読み取る必芁がありたせん。



レッスン7-SUIDスクリプトを䜿甚しない


すべおの䜜業が完了した埌でも、安党なSUIDシェルスクリプトを蚘述するこずはほずんど䞍可胜ですこれはほずんどのシステムでは䞍可胜です。 䞊蚘の問題により、䞀郚のシステムLinuxなどでは、コマンドスクリプトにSUID属性をむンストヌルするこずを掚奚しおいたせん。 SUID機胜を取埗するには、Cラッパヌ、Perlスクリプト、たたはsudoのようなプログラムの3぀の安党な方法がありたす。 安党なプログラミングの初心者は、sudoたたはPerlプログラムを䜿甚する必芁がありたす。 Suidperlには、この蚘事で説明したプログラマヌ向けの゚ラヌ保護メカニズムが組み蟌たれおいたす。 SUID属性を䜿甚した安党なプログラミングの詳现に぀いおは、曞籍Practical UNIXInternet SecurityO'ReillyAssociatesたたは蚘事Writing Writing Safe Setuid Programsを参照しおください。



あずがき。 SUIDを䜿甚するためのプロトタむプラッパヌ

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>



int main()

{

//

setuid(0); // id ( root, )

//setgid(0); // (id )

system("/path/to/script.sh"); //

return 0;

}







All Articles