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アナラむザヌは脆匱性を怜出するのではなく、朜圚的な脆匱性を怜出するこずを蚘述したす。 より正確になりたす。



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



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



All Articles