| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> perl >> 打造Linux安全堡壘Perl的安全性監測
 

打造Linux安全堡壘Perl的安全性監測

2008-05-19 06:25:44  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  CGI使得互聯網上的任何人都可以在你的計算機上運行程序,這就使得CGI成爲世界上最流行的安全漏洞。作爲程序員,我們的責任是不讓壞人侵入我們的系統,對于我們所編制的程序來說,要做到沒有漏洞可鑽。

  例如,下面這個CGI程序,就是個壞程序:

  #!/usr/bin/perl -w

  # cgi-bad ? 一個不好的cgi 腳本的例子

  $file = param("FILE")

  or die "Must fill out the FILE field\n";

  unlink("/usr/local/public/data/$file")

  or die "Can delete $file : $!\n";

  該腳本所做的是讀出在表單中所輸入的文件名,並從目錄/usr/local/public/data/中刪除該名稱的文件。錯了!該腳本所做的實際上是讓任何用戶對在網絡服務器上usercode可以刪除的任何文件作刪除操作。請看:

  % setuid-bad ../../etc/apache/var/userdb

  我們本來要做的是檢查程序的參數,以確定其是否爲文件名。問題是你的程序外部所産生的數據用到了系統調用上,如nlink(), open(),和system()。而你並不打算讓在你的程序之外産生的數據影響到外部世界。

  Perl有個選項,打開後,可以強迫你檢查常數,環境,輸入,或其它有可能被不懷好意的人利用的漏洞。該選項稱爲「tainting」

  打開Taint檢查選項

  要打開taint檢查選項,讓Perl帶一個 -T 選項:

  #!/usr/bin/perl -wT

  如果我們在上述程序運行時,帶有 ?T選項,我們會看到如下信息:

  Insecure dependency in unlink while running with

  -T switch at setuid-bad line 5.

  Perl跟蹤$file中的值,它是在你的程序外部生成的,(它被稱爲「tainted」)。 unlink() 被認爲是個不安全的操作,因爲它對外部世界有影響:文件。在不安全的操作下,企圖使用沒有信任度的(tainted)數據是危險的。正如我們已經看到的,數據可能有詐。

  這些漏洞可以由Perl的taint檢查選項在運行時捕捉到,並且使得程序停下來。

  Tainted數據

  Tainted 數據來源很多,包括:來源于你的環境散列表 (the %ENV) ,參數 (@ARGV),讀入的文件和目錄,來源于運行的程序中,以及一些系統調用的結果(用getpw讀出口令數據庫中的GECOS域)。任何對tainted值的操作(添加,合並,插入),其結果值也是tainted。這就好像是數據一旦被粘上了汙點,那麽無論數據傳播到哪裏,汙點就會被帶到哪裏。

  僅有三種方式,可以得到「untainted」值:數據直接在程序中指明;數據來自于安全的函數(如localtime);或者使用正則表達式提取來自不安全函數的tainted 串的一部分。

  $a = 4; # untainted

  $file = $ARGV[0]; # tainted

  $file =~ m{^([^/]+)$}

  or die "$file is not a good filename.\n";

  $untainted = $1; # untainted

  通過正則表達式用括號括起來,創建了$1, $2, ... 變量。這些都是untainted數據。通過正則表達式,你可以確信它就是你所期望的值。如果匹配失敗,你會得到失敗信息。如果匹配成功,$1 ...變量包含了你可以使用的untainted 數據。

  如果我們已經打開tainting 選項,當我們試圖做unlink()操作時,Perl 解釋器會停下來,告訴你$file 中包含了tainted 數據。文件名是 tainted的,因爲它來自于不信任源:使用你的程序的人。

  壞動作

  如果你所使用的數據是tainted的,你想要Perl程序所做的大多數事情會産生出錯信息。如果文件名或程序名是tainted的,那麽運行程序,打開文件來寫入,以及刪除文件,這些操作都將被禁止進行。

  這一節將演示如何在這種場合下,解除tainted狀態。

  考慮:

  system("ls *.h");

  Perl 在你的串中看到了 *,並決定調用shell,這樣:

  sh -c "ls *.h"

  但是,的確有人可能用假的路徑環境變量來運行你的程序,從而導致調用了錯誤的sh或ls。所以,對于PATH變量以及SHELL中可以用來修改其行爲的其他變量,應該進行 untaint操作。

  一般,運行其它程序時,你應采取三項步驟:

  明確你的環境變量,使得運行的是實際程序。

  關閉shell

  對程序的參數進行untaint操作。

  用如下的等簡單方式清除你的環境變量:

  delete @ENV{"IFS", "CDPATH", "ENV", "BASH_ENV"};

  $ENV{PATH} = "/bin:/usr/bin";

  第一行刪除掉可能會引起問題的環境變量,第二行給出一個確保安全的PATH。你可以添加其他的目錄到PATH中,但務必確保它們同該處一樣,是有確定值的。

  關閉shell也要把握好分寸。Perl 在涉及到有關shell的操作,如 open(), system(), backticks,和exec() 調用時,有自己的規則,這些規則不太容易掌握。最好的規則是:避免使用backticks 和pipe open() 調用,而是使用system() 和exec() ,並傳給它們參數表。

  大多數人習慣于看到如下的寫法:

  system("someprogram arg1 arg2 arg3");

  他們不知道還可這樣寫:

  system("someprogram", "arg1", "arg2", "arg3");

  這樣的寫法,可以精確地告訴Perl的各個參數是什麽,Perl將不會調用shell。 exec() 也具有讀參數表和不調用shell的特點。而如果要使用piped open() 和backticks,就無法保證不會用到shell。

  如果你打算使用piped open 或 backticks,你得用如下的方法重新實現:

  $pid = open(COMMAND, "-|");

  die "Couldn fork: $!" unless defined $pid;

  if ($pid) {

  @lines = ;

  close(COMMAND);

  } else {

  exec("some", "program", "with", "args") or die "execing: $!";

  }

  一般來說,即使你的PATH已經作了安全處理,給出所運行的程序的完整路徑是個好主意。這就會避免了錯誤地調用了/usr/bin/boom 而不是/home/user/bin/boom這種情況的發生,因爲在PATH中 /usr/bin 位于/home/usr/bin/boom.之前。

  文件名

  對文件名進行操作時,使用unlink() 或 ,或者用open()時,是有危險的。

  從目錄中讀入的文件名是tainted的。你可以打開一個tainted 文件名來讀入,但你不能打開它來寫入。從文件中讀數據,不管文件名是否 tainted,已經是tainted的。因爲用到了shell,你不能用 來得到文件清單。

  爲了檢查文件名是否是好的,你得寫出一個正則表達式,並同合法的文件名進行匹配。在一些場合,可以用如下的簡單方法來檢查你的數據:

  $file = $ARGV[0];

  ($file =~ m{^([^/]+)$} && $file ne "." && $file ne "..")

  or die "Bad filename $file\n";

  $file = $1;

  根據任何不包含斜杠的串的正則表達式來檢查文件名,這就把子目錄排除在外,然後排除掉「.」(當前目錄)和「..」(當前目錄的父目錄)。如果這些測試都通過了,$1變量中存放的就是我們可以使用的文件名。

  爲了得到匹配某種模式的文件名清單,你既可以從CPAN (File::KGlob 和File::BSD 是兩個有用的模塊)安裝有關模塊,也可以使用讀目錄操作和正則表達式:

  Untainting過了頭也會有問題

  在不多的場合,盲目地untaint你的數據也産生安全漏洞。所以也此時需要Tainting的存在。如果象下面一樣,盲目地對任何數據都untaint:

  $var =~ /(.*)/s; # 愚蠢

  $var = $1;

  正則表達式中的 /s 符號使得句點可以匹配串中的任何換行符。

  通過用 .* 我們匹配了串中的一切符號,並用$1存放該數據的untainted的副本。

  正如注釋所說的,這樣做是愚蠢的。

  總結

  -T 打開tainting選項。來自你程序之外的數據是tainted,不能使用這些數據,以免影響外部世界。

  用正則表達式和$1, $2, ... 變量進行untaint。要運行其他程序,設置好path,不要使用shell,並對參數進行untaint。

  進一步的閱讀

  在perlsec manpage 中詳細闡述了tainting的機制,並給出了較多的例子。Chapter Perl Cookbook的第十六章談了進程管理,演示了non-shell 版的 piped opens和其他有趣的用法

  
 
 
 
上一篇《利用Perl列出系統環境變量清單範例》
下一篇《Linux腳本語言PERL的模板應用分析》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
  CGI使得互聯網上的任何人都可以在你的計算機上運行程序,這就使得CGI成爲世界上最流行的安全漏洞。作爲程序員,我們的責任是不讓壞人侵入我們的系統,對于我們所編制的程序來說,要做到沒有漏洞可鑽。   例如,下面這個CGI程序,就是個壞程序:   #!/usr/bin/perl -w   # cgi-bad ? 一個不好的cgi 腳本的例子   $file = param("FILE")   or die "Must fill out the FILE field\n";   unlink("/usr/local/public/data/$file")   or die "Can delete $file : $!\n";   該腳本所做的是讀出在表單中所輸入的文件名,並從目錄/usr/local/public/data/中刪除該名稱的文件。錯了!該腳本所做的實際上是讓任何用戶對在網絡服務器上usercode可以刪除的任何文件作刪除操作。請看:   % setuid-bad ../../etc/apache/var/userdb   我們本來要做的是檢查程序的參數,以確定其是否爲文件名。問題是你的程序外部所産生的數據用到了系統調用上,如nlink(), open(),和system()。而你並不打算讓在你的程序之外産生的數據影響到外部世界。   Perl有個選項,打開後,可以強迫你檢查常數,環境,輸入,或其它有可能被不懷好意的人利用的漏洞。該選項稱爲「tainting」   打開Taint檢查選項   要打開taint檢查選項,讓Perl帶一個 -T 選項:   #!/usr/bin/perl -wT   如果我們在上述程序運行時,帶有 ?T選項,我們會看到如下信息:   Insecure dependency in unlink while running with   -T switch at setuid-bad line 5.   Perl跟蹤$file中的值,它是在你的程序外部生成的,(它被稱爲「tainted」)。 unlink() 被認爲是個不安全的操作,因爲它對外部世界有影響:文件。在不安全的操作下,企圖使用沒有信任度的(tainted)數據是危險的。正如我們已經看到的,數據可能有詐。   這些漏洞可以由Perl的taint檢查選項在運行時捕捉到,並且使得程序停下來。   Tainted數據   Tainted 數據來源很多,包括:來源于你的環境散列表 (the %ENV) ,參數 (@ARGV),讀入的文件和目錄,來源于運行的程序中,以及一些系統調用的結果(用getpw讀出口令數據庫中的GECOS域)。任何對tainted值的操作(添加,合並,插入),其結果值也是tainted。這就好像是數據一旦被粘上了汙點,那麽無論數據傳播到哪裏,汙點就會被帶到哪裏。   僅有三種方式,可以得到「untainted」值:數據直接在程序中指明;數據來自于安全的函數(如localtime);或者使用正則表達式提取來自不安全函數的tainted 串的一部分。   $a = 4; # untainted   $file = $ARGV[0]; # tainted   $file =~ m{^([^/]+)$}   or die "$file is not a good filename.\n";   $untainted = $1; # untainted   通過正則表達式用括號括起來,創建了$1, $2, ... 變量。這些都是untainted數據。通過正則表達式,你可以確信它就是你所期望的值。如果匹配失敗,你會得到失敗信息。如果匹配成功,$1 ...變量包含了你可以使用的untainted 數據。   如果我們已經打開tainting 選項,當我們試圖做unlink()操作時,Perl 解釋器會停下來,告訴你$file 中包含了tainted 數據。文件名是 tainted的,因爲它來自于不信任源:使用你的程序的人。   壞動作   如果你所使用的數據是tainted的,你想要Perl程序所做的大多數事情會産生出錯信息。如果文件名或程序名是tainted的,那麽運行程序,打開文件來寫入,以及刪除文件,這些操作都將被禁止進行。   這一節將演示如何在這種場合下,解除tainted狀態。   考慮:   system("ls *.h");   Perl 在你的串中看到了 *,並決定調用shell,這樣:   sh -c "ls *.h"   但是,的確有人可能用假的路徑環境變量來運行你的程序,從而導致調用了錯誤的sh或ls。所以,對于PATH變量以及SHELL中可以用來修改其行爲的其他變量,應該進行 untaint操作。   一般,運行其它程序時,你應采取三項步驟:   明確你的環境變量,使得運行的是實際程序。   關閉shell   對程序的參數進行untaint操作。   用如下的等簡單方式清除你的環境變量:   delete @ENV{"IFS", "CDPATH", "ENV", "BASH_ENV"};   $ENV{PATH} = "/bin:/usr/bin";   第一行刪除掉可能會引起問題的環境變量,第二行給出一個確保安全的PATH。你可以添加其他的目錄到PATH中,但務必確保它們同該處一樣,是有確定值的。   關閉shell也要把握好分寸。Perl 在涉及到有關shell的操作,如 open(), system(), backticks,和exec() 調用時,有自己的規則,這些規則不太容易掌握。最好的規則是:避免使用backticks 和pipe open() 調用,而是使用system() 和exec() ,並傳給它們參數表。   大多數人習慣于看到如下的寫法:   system("someprogram arg1 arg2 arg3");   他們不知道還可這樣寫:   system("someprogram", "arg1", "arg2", "arg3");   這樣的寫法,可以精確地告訴Perl的各個參數是什麽,Perl將不會調用shell。 exec() 也具有讀參數表和不調用shell的特點。而如果要使用piped open() 和backticks,就無法保證不會用到shell。   如果你打算使用piped open 或 backticks,你得用如下的方法重新實現:   $pid = open(COMMAND, "-|");   die "Couldn fork: $!" unless defined $pid;   if ($pid) {   @lines = ;   close(COMMAND);   } else {   exec("some", "program", "with", "args") or die "execing: $!";   }   一般來說,即使你的PATH已經作了安全處理,給出所運行的程序的完整路徑是個好主意。這就會避免了錯誤地調用了/usr/bin/boom 而不是/home/user/bin/boom這種情況的發生,因爲在PATH中 /usr/bin 位于/home/usr/bin/boom.之前。   文件名   對文件名進行操作時,使用unlink() 或 ,或者用open()時,是有危險的。   從目錄中讀入的文件名是tainted的。你可以打開一個tainted 文件名來讀入,但你不能打開它來寫入。從文件中讀數據,不管文件名是否 tainted,已經是tainted的。因爲用到了shell,你不能用 來得到文件清單。   爲了檢查文件名是否是好的,你得寫出一個正則表達式,並同合法的文件名進行匹配。在一些場合,可以用如下的簡單方法來檢查你的數據:   $file = $ARGV[0];   ($file =~ m{^([^/]+)$} && $file ne "." && $file ne "..")   or die "Bad filename $file\n";   $file = $1;   根據任何不包含斜杠的串的正則表達式來檢查文件名,這就把子目錄排除在外,然後排除掉「.」(當前目錄)和「..」(當前目錄的父目錄)。如果這些測試都通過了,$1變量中存放的就是我們可以使用的文件名。   爲了得到匹配某種模式的文件名清單,你既可以從CPAN (File::KGlob 和File::BSD 是兩個有用的模塊)安裝有關模塊,也可以使用讀目錄操作和正則表達式:   Untainting過了頭也會有問題   在不多的場合,盲目地untaint你的數據也産生安全漏洞。所以也此時需要Tainting的存在。如果象下面一樣,盲目地對任何數據都untaint:   $var =~ /(.*)/s; # 愚蠢   $var = $1;   正則表達式中的 /s 符號使得句點可以匹配串中的任何換行符。   通過用 .* 我們匹配了串中的一切符號,並用$1存放該數據的untainted的副本。   正如注釋所說的,這樣做是愚蠢的。   總結   -T 打開tainting選項。來自你程序之外的數據是tainted,不能使用這些數據,以免影響外部世界。   用正則表達式和$1, $2, ... 變量進行untaint。要運行其他程序,設置好path,不要使用shell,並對參數進行untaint。   進一步的閱讀   在perlsec manpage 中詳細闡述了tainting的機制,並給出了較多的例子。Chapter Perl Cookbook的第十六章談了進程管理,演示了non-shell 版的 piped opens和其他有趣的用法   
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
美得讓人陶醉
杭州美女模特米萊
清純迷人唐小妹
氣質一流的上海女生
夢醉克孜加爾湖畔
珠江公園(二)
魔域桃源
南嶺森林公園親水谷
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有