RATSソースコードアナライザー

ソフトウェアの脆弱性を見つける方法の1つは、ソースアナライザーの使用です。 この投稿では、そのうちの1つ、つまりRATS(セキュリティのためのラフ監査ツール)についてお話したいと思います。 RATSは、尊敬される情報源、つまりhereherehereで複数回言及されました 。 ただし、実際の使用例はどこにもありませんでした。



そのため、RATSはFortifyによって作成され、C / C ++、Perl、Ruby、PHP、Pythonで記述されたコードのバグを見つけるように設計されており、重要なこととして無料で配布されています。 このユーティリティから特別な奇跡を期待するべきではありませんが、「危険な」機能を使用する場所を見つけるでしょう。



設置


RATSのインストールから始めましょう。次に、Debian OS(wheezy)の例です。RATSパッケージはここから入手できますwget debパッケージftp.us.debian.org/debian/pool/main/r/rats/rats_2.3-1_amd64.debをダウンロードし、 sudo dpkg –i / path / package.debをインストールします。

すべてが正しくインストールされているかどうかを確認しましょう。このために、コンソールにratと入力します。

$ラット

perlデータベースのエントリ:33

rubyデータベースのエントリ:46

Pythonデータベースのエントリ:62

cデータベースのエントリ:334

PHPデータベースのエントリ:55

分析された合計行数:0

合計時間0.000010秒

1秒あたり0行

ここでは、RATSデータベース(バージョン2.3-1)に含まれる典型的なエラーパターンの数を確認します。



例1


それでは、RATSを「戦いで」試してみましょう。 これを行うには、明らかに古典的なバッファオーバーフローエラーを含むコードを記述し、vuln_code1.cファイルに保存します。



#include <string.h> int main (int argc, char **argv) { char buffer[10]; strcpy(buffer, argv[1]); }
      
      





次に、このRATSファイルを表示します。 $ rats vuln_code1.c



vuln_code1.cの分析

vuln_code1.c:4:高:固定サイズのローカルバッファー

割り当てられる文字配列を確実にするために、特に注意が必要です。

スタック上の安全に使用されます。 バッファオーバーフローの主要なターゲット

攻撃。



vuln_code1.c:5:高:strcpy

この関数呼び出しに渡された引数2がコピーされないことを確認してください

処理できるデータよりも多くのデータがあり、バッファオーバーフローが発生します。



分析された合計行数:7

合計時間0.000154秒

1秒あたり45454行



RATSは2つのエラーを通知しますが、どちらも高いレベルの危険を割り当てます。

最初の「 固定サイズのローカルバッファ 」は、行4の固定バッファサイズの使用です- 文字バッファ[10]。

2番目の「 バッファオーバーフロー 」は、5行目のバッファオーバーフローです。strcpy()関数を使用する場合です。 strcpy()関数の代わりにgets()を使用する 、RATSメッセージは次のようになります。

vuln_code1.c:5:高:取得

取得は安全ではありません!!! 境界チェックは実行されず、ユーザーはバッファを簡単にオーバーフローできます。 代わりにfgets(buf、size、stdin)を使用してください



例2


書式文字列の脆弱性を含むコードに対するRATSの反応を確認します。これを行うために、欠陥コードを記述します。printf関数は入力文字列を受け取り、指定子「%x %x "パラメータとして、スタックの4バイトの内容を見ることができます。



 #include <stdio.h> int main(int arg, char* argv[ ]) { if(argc > 1) printf(argv[1]); return 0; }
      
      





RATSはエラーを検出し、報告しました:



vuln_code3.c:5:高:printf

引数1として渡される非定数形式文字列が

この関数呼び出しは、追加された可能性のある信頼できないソースからのものではありません

コードが処理する準備ができていないフォーマット文字。



例3


この例では、環境変数を操作するときにバッファーオーバーフローエラーを含むコードを使用します。



 #include <stdlib.h> int main(int argc, char *argv[ ]) { char *env; char buf[100]; env = getenv("PATH"); if ( env == NULL ) { return 0; } sprintf(buf, "%s", env); return 0; }
      
      





ここで、RATSは3つのエラーを見つけました。



vuln_code4.c:5:高:固定サイズのローカルバッファー

割り当てられる文字配列を確実にするために、特に注意が必要です。

スタック上の安全に使用されます。 バッファオーバーフローの主要なターゲット

攻撃。



vuln_code4.c:6:高:getenv

環境変数は非常に信頼できない入力です。 どんな長さでもかまいませんが、

データが含まれています。 内容や長さに関する仮定をしないでください。

可能な場合は使用を避け、必要な場合はサニタイズして切り捨てます

それらを妥当な長さにします。

環境変数の長さには制限がないため、環境変数を使用するために割り当てるバッファーの長さを慎重に確認する必要があります。



vuln_code4.c:8:高:sprintf

形式文字列がこの関数に引数2として渡されたことを確認してください

呼び出しは、フォーマットを追加した可能性のある信頼できないソースからのものではありません

コードが処理する準備ができていない文字。 さらに、フォーマット

文字列に精度のない `%s 'が含まれている可能性があり、その結果バッファが生じる

オーバーフロー。



例4


他のプログラミング言語での状況を確認し、脆弱なperlスクリプトでRATSをテストしてみましょう。



 open(f,$filename); while(<f>) { print; }
      
      





このようなスクリプトの入力に「| command」を入力すると、コマンドが実行されます。 RATSデータベースにはこのような脆弱性があります。open()関数を使用する場合は、入力データを慎重に分析することをお勧めします。

test9.pl:1:中:オープン

openのファイル名引数は、そのコンポーネントとしてユーザー指定の文字列を使用して作成されている場合、慎重にチェックする必要があります。 文字列をチェックして、パスバックトラッキング/相対パスコンポーネント(../など)の発生、または基礎となるC呼び出しがファイル名を予想とは異なる方法で開くよう解釈する可能性のあるヌルを確認する必要があります。 また、パスが実行されるため、最終ファイル名が「|」で終わっていないことを確認することも重要です。



使用の特徴




おわりに


過去数年間、RATSは深刻なプロジェクトの包括的な脆弱性アナライザーとは見なすべきではありませんが、教科書のエラーを特定して理解するためのトレーニングオプションとして非常に適しています。



参照資料


バッファオーバーフローの脆弱性に関する詳細: www.securitylab.ru/contest/212095.php

ソフトウェアの脆弱性の分析と検索に関する優れた、しかし複雑な本: www.ozon.ru/context/detail/id/5238324

CGIスクリプトのセキュリティ記事: www.getinfo.ru/article358.html



All Articles