web-dev-qa-db-ja.com

Go実行可能ファイルの既知の脆弱性(CVE)を発見するにはどうすればよいですか?

CVEを検出するツールは、ソフトウェアの部品表を作成する必要があります。多くの場合、ターゲットシステム上のファイルを検査するだけで実行できます。 RPMまたはNPMインデックス。

Goソースコードとは対照的に、Go実行可能ファイルの構成分析を行うことはできますか?

それを試みるツールはありますか?

編集:問題は、一般的にgo言語でプログラムされた実行可能ファイルと、ターゲットシステムの脆弱性スキャンの実行の一部として、これらの実行可能ファイルの推移的な依存関係を自動的に検出する方法についてです。

2
tsaarni

あんまり。つまり、理論的にはそうすることができますが、だれもがそうすることは不合理ではありません。

Goは比較的安全な言語であるため、Goコードの脆弱性は機械的なエラーではなく、論理的なエラーである傾向があります。つまり、脆弱性はバイナリのパターンではなく、制御フローの属性によってマークされます。

基本的に、特定のCVEを検出するには、脆弱なロジックに対応するオペコードシーケンスを作成し、バイナリをそのパターンと照合する必要があります。これは些細なパターンの場合は単純かもしれませんが、些細なパターンはありそうになく、本質的に何の利益もないため、多くの作業が必要です。

結局のところ、脆弱性の検出は基本的にサプライチェーンの問題です。アップストリームが脆弱性メタデータを入手できない場合、信頼モデル全体が失敗します。 areアップストリーム(バイナリを構築する)の場合は、CVEの関連性を判断するために使用できるパッケージの詳細(ソースコードの出所など)にメタデータの埋め込みを開始する必要があります。

2
tylerl

Go実行可能ファイルを検査して脆弱性を検出できる脆弱性スキャン/監査が必要だと聞きました。 "golang vulnerable function"などのキーワードに適合するいくつかの記事をすでに読んでいますが、-スタックオーバーフロー(ig、 strcpygetssprintf、...)、メモリ隣接オーバーフロー(ig、strncpystrncat、...)と何度も。しかし、私はこの方法で欠陥を発見する方法を見つけていませんが、CVEDetailsにリストされているいくつかのCVEについて前述したように、これらの既知の脆弱性はNIST National Vulnerability Database(通常、認証されていない脆弱性スキャンで使用されます。そのため、一部の脆弱性スキャンでは、資格情報を必要とせずにいくつかの欠陥を見つけることができます-つまり、Nmap and Nessus)。また、脆弱性監査も使用できます。 Open Vulnerability Assessment Language(別名OVAL言語-公開されて公開されているセキュリティコンテンツで、この情報の転送全体を標準化する方法)セキュリティツールとサービスの範囲。1 -通常、認証スキャンで使用されます(つまり、OpenSCAP))。つまり、それについて読んで独自の「ルール」を作成し、既知の脆弱性を検出できます。

公的に情報セキュリティの脆弱性

既知の脆弱性データベース(NVDCVEやCVEなど)には情報の欠落があるため、false negativeにかなり偏っています(スキャンの存在をトリガーするのに十分な情報がない場合)脆弱性)そしてまれに、これも発生する可能性がありますfalse positiveアラート(つまり、環境に存在しない脆弱性を報告できる)。上のパッケージ情報で脆弱性評価を実行する場合あなたがアクセスできるマシンの場合、この旅のパートナーとしてOVAL言語を選択することをお勧めします。

脆弱性スキャンと脆弱性監査

どちらも目的が異なるため、両者を比較することはできませんが、どちらもシステムの弱点の発見に重点を置いています。脆弱性監査(LynisやSCAPなど)はテストを実行して、システムがどのように構成されているかを可能な限り隅々まで確認します。もう1つの方法は、ソフトウェアの欠陥を発見し、実行中のサービスまたはインストールされているアプリケーションを検出するために実行される脆弱性スキャン(つまり、NessusおよびQualysGuard)ですが、結果としてそれらに対していくつかのテストを実行し、その結果を報告します

GoLangの既知の脆弱性の分析

たとえば、CVE-2018-6574:_https://www.cvedetails.com/cve/CVE-2018-6574/_。

"Scroll to-> OVAL Definitions"を実行すると、 "OVAL Definition ID"(_oval:com.redhat.rhsa:def:20180878_)が表示されますをクリックして下にスクロールし、現在および関連する脆弱性を評価する条件付き構造を表示します。特定のCVEで脆弱性評価を行う署名の書き方を知りたい場合は、Open Vulnerability Assessment Language(OVAL言語)をお読みになることをお勧めします2、主にOVALコンテンツ作成チュートリアル 論文。

CVEDetailsにリストされているこれらの脆弱性のすべてにもかかわらず、それはそれらすべての公的なOVAL定義であることを意味しません、例えば、CVE-2018-71874。この脆弱性はGoLangバージョン1.9.4にあります。

Go 1.9.4の「go get」実装は、-insecureコマンドラインオプションを使用すると、インポートパスを検証しません(get/vcs.goは文字列の「://」のみをチェックします)。リモートの攻撃者が巧妙に細工されたWebサイトを介して任意のOSコマンドを実行することを可能にします。

公開日:2018-02-16最終更新日:2018-03-13

参照:_https://github.com/golang/go/issues/23867_

上記の[CVE-2018-7187] CVEDetails情報によると、オペレーティングシステムはDebian GNU/Linux 7ですが、Linuxのようなオペレーティングシステムで検証できます。 OVAL署名を構成するすべての情報をまとめるかどうか:

  • OVAL定義:チェック対象を意味します。 "OVAL Definitions"は、複数の "Definition"クラスおよび以下で説明する他のカテゴリで構成できるカテゴリです。

    • 基準:これは、OVAL Definitionsカテゴリーに関連付けられているクラスです。このクラスの役割は、 "Test"に対して現在評価しているものに対応する転送ルーチンです。
  • OVALオブジェクト:これは、見つかると予想される未加工の情報を指定します。通常、このトピックにはリテラル名(アプリケーション、Windowsレジストリキーなど)が含まれています

  • OVALテスト:これは、何をチェックしているかに対して論理テストを実行します。おおまかに言って、これはntrueとしてトリガーするアイテムの存在を少なくとも保証します。

  • OVAL状態:これは、収集された情報と比較されることが予想される情報を指定します。

  • 結果:(OVAL状態から)期待される情報が収集されたものから評価されると、一致値(trueまたはfalse)が結果評価のレポートとしてOVAL結果に保存されます。

注:詳細については、参照を参照してください。

OVAL言語を使用したCVE-2018-7187の検出:

ターゲットに応じて脆弱性評価を行うことができます。 Windowsの場合、OVALid5 LinuxのようなOSの場合、OpenSCAP Baseを使用できます。6

次の手順では、独自のラボを構築して、LinuxのようなOS環境にソフトウェアアプリケーションの脆弱性評価を行う方法について少し説明します。

1.ラボを作成します。

必要なパッケージは次のとおりです。

_autoconf automake libtool make libdbus-1-dev libdbus-glib-1-dev libcurl4-openssl-dev libgcrypt20-dev libselinux1-dev libxslt1-dev libgconf2-dev libacl1-dev libblkid-dev libcap-dev libxml2-dev libldap2-dev libpcre3-dev python-dev swig libxml-parser-Perl libxml-xpath-Perl libperl5.22 python-dev libbz2-dev librpm-dev swig
_

1.2。 OpenSCAPのコンパイル

_$ git clone https://github.com/OpenSCAP/openscap.git
$ cd openscap
$ ./autogen.sh && ./configure && make
_

注:予期しないインストールエラーが発生した場合は、このOpenSCAPガイド、開発者の操作をお読みください7。 "rpmlogClose()"シンボルを解決しないためにリンクエラーが発生した場合は、_src/OVAL/probes/Makefile_に移動して_1210_行を編集し、_-lrpmio_を追加します。8

2. OVAL言語ルールを準備します。

Ubuntu 18.04.1 LTSでテストされたCVE-2018-7187を検出するルールを作成しました:_https://Gist.github.com/slayerlab/b2a358f13ab267f2e9543bb9f9320ffc_

3. OpenSCAPを使用して脆弱性評価を実行します。

ローカルマシン:

_$ oscap oval eval linux-definitions-vulnerability-oval.xml 
Definition oval:com.stackexchange.security:def:666: true
Evaluation done.
_

リモートマシンでは、次のコマンドラインで_oscap-ssh_を使用できます。

_$ oscap <user@domain> oval eval <oval_rule>_

またはmpreislerによるbashスクリプト_oscap-ssh_を使用します9

_$ bash oscap-ssh [email protected] 22 oval eval ~/PoC/linux-definitions-vulnerability-oval.xml 
Connecting to '[email protected]' on port '22'...
[email protected]'s password: 
Connected!
Copying input file '/home/slayer/PoC/linux-definitions-vulnerability-oval.xml' to remote working directory '/tmp/tmp.bh28nES8c9'...
linux-definitions-vulnerability-oval.xml                                                                  100% 3386     3.0MB/s   00:00    
Starting the evaluation...
Definition oval:com.stackexchange.security:def:666: true
Evaluation done.
oscap exit code: 0
Copying back requested files...
Removing remote temporary directory...
Disconnecting ssh and removing master ssh socket directory...
_
1
slayer