![](https://habrastorage.org/getpro/habr/post_images/2cc/d5d/05a/2ccd5d05a1562ffa550b7bdbed0f04a5.png)
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 | äºææ§ã®ãªãã¿ã€ãã䜿çšãããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ïŒãã¿ã€ãã®æ··ä¹±ãïŒ |
ããã§ãç¹å®ã®ãããžã§ã¯ãã§æœåšçãªè匱æ§ãçºèŠãããããžã§ã¯ãã®æ€èšŒã«é¢ããèšäºãæžãããšãã§ããŸãã å€ãã®åæè ãã»ãã¥ãªãã£ã®æ¬ é¥ãç¹å®ããŠãããšèªæ ¢ããŠãããããèšäºã§ã¯ãã®ãããã¯ã«è§ŠããŸãã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³
èšäºãæžããšãã«äžèšã®è¡šã䜿çšããæ¹æ³ãèŠãŠã¿ãŸãããã ãããžã§ã¯ããåæãã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é¢æ°åŒã³åºããåé€ããå¿ èŠããããŸãã ãããã£ãŠããã©ã€ããŒãããŒã¿ã¯äžæžãããããã¡ã¢ãªã«æ®ããŸãã
ããã¯ãã³ã³ãã€ã©ã®çè«çã«å¯èœãªæœè±¡çãªåäœã§ã¯ãªãããšã«æ³šæããŠãã ããã ã³ã³ãã€ã©ã¯å®éã«ãããè¡ã£ãŠããã°ã©ã ãé«éåããŸãã 詳现ïŒ
- ã¡ã¢ãªã®äžæžã-ãªãã§ããïŒ
- V597 ã³ã³ãã€ã©ã¯ããFooããããã¡ããã©ãã·ã¥ããããã«äœ¿çšãããã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ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã