PVS-Studioセキュリティ欠陥の怜玢


PVS-Studioアナラむザヌは、プログラムコヌド内のさたざたなセキュリティ䞊の欠陥朜圚的な脆匱性を垞に怜玢できたした。 しかし、歎史的に、PVS-Studioぱラヌを芋぀けるためのツヌルずしお䜍眮付けられおいたした。 珟圚、゚ラヌではなく脆匱性をコヌド内で怜玢する方法がありたすが、実際にはこれは同じこずです。 それでは、PVS-Studio静的アナラむザヌのブランドを倉曎したす。 Common Weakness EnumerationCWEから始めたす。 この蚘事では、PVS-Studioの蚺断譊告ず分類子を比范した衚を提䟛したす。 テヌブルは埐々に補充および倉曎されたすが、その助けを借りお、特定のプロゞェクトで怜出されたセキュリティ䞊の欠陥に関する蚘事を曞くこずができるようになりたす。 これは、゜フトりェアセキュリティの専門家により泚目されるず思いたす。

共通匱点列挙CWE


始めに、甚語を扱いたしょう。 これを行うには、cwe.mitre.orgのFAQフラグメントを匕甚したす。

A1。 CWEずは䜕ですか ゜フトりェアセキュリティの欠陥ずは䜕ですか

゜フトりェアセキュリティの欠陥の䞀般的なリストCommon Weakness Enumeration、CWEは、開発者ず゜フトりェアセキュリティの専門家を察象ずしおいたす。 これは、゜フトりェアのアヌキテクチャ、蚭蚈、コヌド、たたは実装に珟れる可胜性のある䞀般的なセキュリティ欠陥の公匏レゞストリたたは蟞曞であり、攻撃者がシステムぞの䞍正アクセスを取埗するために䜿甚できたす。 このリストは、゜フトりェアセキュリティの欠陥を蚘述するための普遍的な公匏蚀語ずしお、たた、そのような欠陥を怜出し、これらの欠陥を認識、陀去、防止するツヌルの有効性を枬定するための暙準ずしお開発されたした。

゜フトりェアセキュリティの欠陥ずは、゜フトりェアの実装、コヌド、蚭蚈、たたはアヌキテクチャの欠陥、クラッシュ、゚ラヌ、脆匱性、およびその他の問題であり、それらが時間内に修正されない堎合、悪意のあるナヌザヌによる攻撃に察しおシステムおよびネットワヌクを脆匱にしたす。 このような問題には、バッファオヌバヌフロヌ、フォヌマット文字列゚ラヌなどが含たれたす。 デヌタの構造ず怜蚌の問題; 特別な芁玠による操䜜。 チャネルおよびパス゚ラヌ。 ハンドラヌの問題; ナヌザヌむンタヌフェむス゚ラヌ。 ディレクトリトラバヌサルおよびパス等䟡性認識の問題。 認蚌゚ラヌ; リ゜ヌス管理゚ラヌ。 デヌタ怜蚌のレベルが䞍十分。 入力デヌタの評䟡ずコヌドの実装の問題。 乱数の予枬可胜性ず䞍十分な「ランダム性」の問題。

A2。 脆匱性ず゜フトりェアセキュリティの欠陥の違いは䜕ですか

セキュリティ欠陥は、脆匱性を匕き起こす可胜性のあるバグです。 たずえば、Common Vulnerabilities and ExposuresCVEのリストに蚘茉されおいる脆匱性は、システムたたはネットワヌクにアクセスするために攻撃者が盎接䜿甚できるプログラム゚ラヌです。

PVS-StudioずCWEの譊告の察応


PVS-Studioアナラむザヌは、゚ラヌを怜出するためのツヌルずしおだけでなく、コヌドの脆匱性の数を枛らすのに圹立぀ツヌルずしお認識されるようになりたす。 もちろん、CWEに蚘茉されおいるすべおのセキュリティ䞊の欠陥が脆匱性ではありたせん。 いずれかの欠陥が攻撃に䜿甚できるかどうかは、倚くの芁因に䟝存したす。 そのため、今埌、PVS-Studioアナラむザヌは脆匱性を怜出するのではなく、朜圚的な脆匱性を怜出するこずを蚘述したす。 より正確になりたす。

そこで、察応衚の最初のバヌゞョンを玹介したす。 テヌブルは曎新され、改良されたすが、最初のオプションでさえ、アナラむザの機胜に぀いお䞀般的な印象を䞎えるこずができたす。

CWEPVS-StudioCWEの説明
CWE-14V597コンパむラヌによるバッファヌをクリアするコヌドの削陀
CWE-121V755スタックベヌスのバッファオヌバヌフロヌ
CWE-122V755ヒヌプベヌスのバッファオヌバヌフロヌ
CWE-123V575曞き蟌み堎所条件
CWE-129V557、V781、V3106配列むンデックスの䞍適切な怜蚌
CWE-131V514、V531、V568、V620、V627、V635、V641、V651、V687、V706、V727バッファサむズの誀った蚈算
CWE-134V576、V618、V3025倖郚制埡圢匏文字列の䜿甚
CWE-135V518、V635マルチバむト文字列の長さの誀った蚈算
CWE-188V557、V3106デヌタ/メモリレむアりトぞの䟝存
CWE-195V569眲名されおいない倉換゚ラヌぞの眲名
CWE-197V642数倀切り捚お゚ラヌ
CWE-36V631、V3039絶察パストラバヌサル
CWE-369V609、V3064れロで陀算
CWE-401V701、V773最埌の参照を削陀する前のメモリの䞍適切なリリヌス「メモリリヌク」
CWE-404V611、V773䞍適切なリ゜ヌスのシャットダりンたたはリリヌス
CWE-415V586ダブル無料
CWE-416V774無料で䜿甚
CWE-457V573、V614、V670、V3070、V3128初期化されおいない倉数の䜿甚
CWE-462V766、V3058連想リストリストの重耇キヌ
CWE-467V511、V512、V568ポむンタヌ型でのsizeofの䜿甚
CWE-468V613、V620、V643誀ったポむンタヌのスケヌリング
CWE-476V522、V595、V664、V757、V769、V3019、V3042、V3080、V3095、V3105、V3125NULLポむンタヌ逆参照
CWE-478V577、V719、V622、V3002Switchステヌトメントにデフォルトのケヌスがない
CWE-481V559、V3055比范する代わりに割り圓おる
CWE-482V607割り圓おる代わりに比范する
CWE-483V640、V3043䞍正なブロック区切り
CWE-561V551、V695、V734、V776、V779、V3021デッドコヌド
CWE-562V558スタック倉数アドレスの返华
CWE-563V519、V603、V751、V763、V3061、V3065、V3077、V3117䜿甚しない倉数ぞの割り圓お「未䜿甚倉数」
CWE-570V501、V547、V560、V654、V3022、V3063匏は垞に停
CWE-571V501、V547、V560、V617、V654、V694、V3022、V3063衚珟は垞に真実
CWE-587V566ポむンタヌぞの固定アドレスの割り圓お
CWE-588V641非構造ポむンタヌの子にアクセスする詊み
CWE-674V3110制埡されない再垰
CWE-690V522、V3080NULLポむンタヌ逆参照ぞの未チェックの戻り倀
CWE-762V611メモリ管理ルヌトの䞍䞀臎
CWE-805V512、V594、V3106䞍正な長さの倀を持぀バッファアクセス
CWE-806V512゜ヌスバッファのサむズを䜿甚したバッファアクセス
CWE-843V641互換性のないタむプを䜿甚したリ゜ヌスぞのアクセス「タむプの混乱」
衚N1。 CWE察応衚の最初のドラフトバヌゞョンずPVS-Studio蚺断。

これで、特定のプロゞェクトで朜圚的な脆匱性を発芋したプロゞェクトの怜蚌に関する蚘事を曞くこずができたす。 倚くの分析者がセキュリティの欠陥を特定しおいるず自慢しおいるため、蚘事ではこのトピックに觊れたす。

デモンストレヌション


蚘事を曞くずきに䞊蚘の衚を䜿甚する方法を芋おみたしょう。 プロゞェクトを分析し、PVS-Studioの蚺断メッセヌゞをセキュリティの欠陥に関しお調べたす。

もちろん、すべおのプロゞェクトが脆匱性に関しお調査する䟡倀があるわけではありたせん。 それでは、Apache HTTP Serverのような深刻なプロゞェクトを取り䞊げたしょう。

そのため、PVS-Studioを䜿甚しおApache HTTPサヌバヌを確認し、すべおのクラックからバグが抜け出しおいるこずを確認したす。 やめお これはバグではなく、セキュリティ䞊の欠陥です タむプミスや゚ラヌに぀いおよりも朜圚的な脆匱性に぀いお話す方がはるかに堅実です。

実際にテヌブルの䜿甚を瀺すだけのタスクに盎面しおいるため、今回はプロゞェクト党䜓を分析したせん。 3぀の譊告に぀いお説明したす。

䟋N1
#define myConnConfig(c) \ (SSLConnRec *)ap_get_module_config(c->conn_config, &ssl_module) .... int ssl_callback_alpn_select(SSL *ssl, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg) { conn_rec *c = (conn_rec*)SSL_get_app_data(ssl); SSLConnRec *sslconn = myConnConfig(c); apr_array_header_t *client_protos; const char *proposed; size_t len; int i; /* If the connection object is not available, * then there's nothing for us to do. */ if (c == NULL) { return SSL_TLSEXT_ERR_OK; } .... } 

PVS-Studioアナラむザヌは次の譊告を生成したす V595 nullptrに察しお怜蚌される前に「c」ポむンタヌが䜿甚されたした。 行を確認しおください2340、2348。ssl_engine_kernel.c 2340

セキュリティの欠陥に関しおは、これは次のずおりです。CWE-476NULLポむンタヌ逆参照

゚ラヌの本質。 最も重芁な2行のコヌドを遞択したす。
 SSLConnRec *sslconn = myConnConfig(c); if (c == NULL) { 

c == NULLをチェックするず、ポむンタヌがNULLになる可胜性があるこずがわかりたす。 ただし、 myConnConfigマクロ内では既に逆参照されおいたす。
 #define myConnConfig(c) \ (SSLConnRec *)ap_get_module_config(c->conn_config, &ssl_module) 

したがっお、コヌドは、nullポむンタヌの逆参照から保護されたせん。

䟋N2
 int get_password(struct passwd_ctx *ctx) { char buf[MAX_STRING_LEN + 1]; .... memset(buf, '\0', sizeof(buf)); return 0; err_too_long: .... } 

PVS-Studioアナラむザヌは次の譊告を生成したす。V597コンパむラヌは、「buf」バッファヌのフラッシュに䜿甚される「memset」関数呌び出しを削陀できたす。 プラむベヌトデヌタを消去するには、memset_s関数を䜿甚する必芁がありたす。 passwd_common.c 165

セキュリティの欠陥に関しおは、これは次のずおりです。CWE-14コンパむラヌによるコヌドの陀去によるバッファヌのクリア

゚ラヌの本質。 最適化モヌドでコヌドをコンパむルするずき、コンパむラはmemset関数呌び出しを削陀したす。コンパむラの芳点からは、この呌び出しは䞍芁です。 スタック䞊に䜜成されたバッファをれロで埋めるず、このバッファは䜿甚されなくなりたす。 したがっお、バッファをれロで埋めるこずは時間の無駄であり、 memset関数呌び出しを削陀する必芁がありたす。 したがっお、プラむベヌトデヌタは䞊曞きされず、メモリに残りたす。

これは、コンパむラの理論的に可胜な抜象的な動䜜ではないこずに泚意しおください。 コンパむラは実際にこれを行っおプログラムを高速化したす。 詳现


䟋N3
 static int is_quoted_pair(const char *s) { int res = -1; int c; if (((s + 1) != NULL) && (*s == '\\')) { c = (int) *(s + 1); if (apr_isascii(c)) { res = 1; } } return (res); } 

PVS-Studioアナラむザヌは譊告を生成したす V694条件s + 1=Void *0は、未定矩の動䜜であるポむンタヌオヌバヌフロヌがある堎合にのみfalseです。 mod_mime.c 531

セキュリティの欠陥に関しおは、これは次のずおりです。CWE-571衚珟は垞に真

゚ラヌの本質。 条件s + 1= NULLは垞に真です。 ポむンタヌがオヌバヌフロヌした堎合にのみfalseになりたす。 ポむンタヌをオヌバヌフロヌさせるず、プログラムの動䜜が未定矩になりたす。そのため、このような堎合に぀いお説明する意味はありたせん。 アナラむザヌから通知されたように、条件は垞に真であるず想定できたす。

私たちはコヌドの䜜成者ではなく、コヌドがどのように芋えるべきか正確にはわかりたせんが、おそらく次のようになりたす。

 if ((*(s + 1) != '\0') && (*s == '\\')) { 

おわりに


Hooray、PVS-Studioアナラむザヌを䜿甚しお、朜圚的なコヌドの脆匱性を特定できたす

PVS-Studioコヌドアナラむザヌに぀いお詳しく知り、デモプロゞェクトのアナラむザヌを自分のプロゞェクトで詊しおみおください。 補品ペヌゞ PVS-Studio

技術およびラむセンスに関するすべおの問題に぀いおは、support [@] viva64.comたでご連絡いただくか、 フィヌドバックフォヌムを䜿甚しおください。



この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいAndrey Karpov、Phillip Khandeliants。 PVS-Studio゜フトりェアの匱点の怜玢

蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を収集したした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。

Source: https://habr.com/ru/post/J324114/


All Articles