
PHPã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®éçºã«éäžçã«äœ¿çšãããæ±çšã¹ã¯ãªããããã°ã©ãã³ã°èšèªã§ãã çŸåšã倧åã®ãã¹ãã£ã³ã°ãããã€ããŒã«ãã£ãŠãµããŒããããŠãããåçãªWebãµã€ãã®äœæã«äœ¿çšãããããã°ã©ãã³ã°èšèªã®ãªãŒããŒã®1ã€ã§ãã
ã³ã³ãã€ã©ãšã€ã³ã¿ãŒããªã¿ãŒã®å ŽåãååãšããŠããœãŒã¹ã³ãŒããšãã¹ãã«ã¯é«ãå質ãšä¿¡é Œæ§ã®èŠä»¶ããããŸãã ããããPHPã€ã³ã¿ãŒããªã¿ãŒã®ãœãŒã¹ã³ãŒãã«ã¯çãããå ŽæããããŸããã
ãã®èšäºã§ã¯ã PVS-Studio 5.18ã䜿çšããŠååŸããPHPã€ã³ã¿ãŒããªã¿ãŒããã§ãã¯ããçµæã調ã¹ãŸãã
åäžã®æ¡ä»¶åŒ
V501 '||'ã®å·Šãšå³ã«åäžã®å¯æ¬¡åŒ 'ïŒMemcmpïŒ "auto"ãcharset_hintã4ïŒ'ããããŸãã æŒç®åã html.c 396
static enum entity_charset determine_charset(char *charset_hint TSRMLS_DC) { .... if ((len == 4) /* sizeof (none|auto|pass) */ && //<== (!memcmp("pass", charset_hint, 4) || !memcmp("auto", charset_hint, 4) || //<== !memcmp("auto", charset_hint, 4))) //<== { charset_hint = NULL; len = 0; } .... }
æ¡ä»¶åŒã«ã¯ãåããã©ã¡ãŒã¿ãŒã䜿çšããé¢æ° 'memcmp'ã®åŒã³åºããå«ãŸããŠããŸãã ã³ã¡ã³ã/ * sizeofïŒnone | auto | passïŒ* /ã¯ãé¢æ°ã®1ã€ã«å€ãnoneããæž¡ãå¿ èŠãããããšã瀺ããŠããŸãã
åžžã«åœã®ç¶æ
V605åŒïŒshell_wrote>-1ã®æ€èšŒãæ€èšããŠãã ããã笊å·ãªãã®å€ã¯ãæ°å€-1ãšæ¯èŒãããŸãã php_cli.c 266
PHP_CLI_API size_t sapi_cli_single_write(....) { .... size_t shell_wrote; shell_wrote = cli_shell_callbacks.cli_shell_write(....); if (shell_wrote > -1) { //<== return shell_wrote; } .... }
ãã®æ¯èŒã¯æãããªééãã§ãã '-1'㯠'size_t'åã®æ倧å€ã«å€æããããããæ¡ä»¶ã¯åžžã«falseã«ãªãããã§ãã¯å šäœãç¡å¹ã«ãªããŸãã å€æ° 'shell_wrote'ã«ã¯ä»¥åã«ç¬Šå·ä»ãã®åãå«ãŸããŠããå¯èœæ§ããããŸããããªãã¡ã¯ã¿ãªã³ã°åŸã笊å·ãªãã®åã®æäœã®æ©èœã¯èæ ®ãããŸããã§ããã
ç¡å¹ãªæ¡ä»¶
V547åŒ 'tmp_len> = 0'ã¯åžžã«trueã§ãã 笊å·ãªãã®åã®å€ã¯åžžã«> = 0ã§ããftp_fopen_wrapper.c639
static size_t php_ftp_dirstream_read(....) { size_t tmp_len; .... /* Trim off trailing whitespace characters */ tmp_len--; while (tmp_len >= 0 && //<== (ent->d_name[tmp_len] == '\n' || ent->d_name[tmp_len] == '\r' || ent->d_name[tmp_len] == '\t' || ent->d_name[tmp_len] == ' ')) { ent->d_name[tmp_len--] = '\0'; } .... }
笊å·ãªãã®ãsize_tãã¿ã€ãã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®å®¹éã«å¯ŸããŠé åèŠçŽ ã®æ倧æ°ã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãã ãã§ãã¯ïŒtmp_len> = 0ïŒã¯æ£ãããããŸããã ææªã®å Žåããã¯ãªã¡ã³ãã«ããã€ã³ããã¯ã¹ãªãŒããŒãããŒãçºçããã¢ã¬ã€å€ã®ã¡ã¢ãªã¢ã¯ã»ã¹ãçºçããå¯èœæ§ããããŸãã ã»ãšãã©ã®å Žåãã³ãŒãã¯è¿œå ã®æ¡ä»¶ãšæ£ããåæããŒã¿ã®ããã«æ£ããå®è¡ãããŸããããã«ãŒãããŸãã¯é åããåºãå±éºæ§ããããŸãã
笊å·ãªãã®æ°ã®å·®
V555åŒãout_buf_size-ocnt> 0ãã¯ãout_buf_sizeïŒ= OcntããšããŠæ©èœããŸãã filters.c 1702
static int strfilter_convert_append_bucket( { size_t out_buf_size; .... size_t ocnt, icnt, tcnt; .... if (out_buf_size - ocnt > 0) { //<== .... php_stream_bucket_append(buckets_out, new_bucket TSRMLS_CC); } else { pefree(out_buf, persistent); } .... }
ãã¶ããelseãã©ã³ãã¯å®è¡ããå¿ èŠããããããé »ç¹ã«å®è¡ãããŸããã 笊å·ãªãã®æ°å€ã®å·®ã¯ã»ãšãã©åžžã«ãŒããã倧ãããªããŸãã äŸå€ã¯ãªãã©ã³ãã®ç䟡æ§ã§ãããã®å Žåãæ¡ä»¶ã¯ããæçãªããŒãžã§ã³ã«æžãçŽãæ¹ãé©åã§ãã
ãã€ã³ã¿ãŒã®éåç §
V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããfunction_nameããã€ã³ã¿ãŒã䜿çšãããŸããã ãã§ãã¯è¡ïŒ4859ã4860ãbasic_functions.c 4859
static int user_shutdown_function_call(zval *zv TSRMLS_DC) { .... php_error(E_WARNING, "....", function_name->val); //<== if (function_name) { //<== STR_RELEASE(function_name); } .... }
åç §è§£é€åŸã«ãã€ã³ã¿ããã§ãã¯ãããšãåžžã«çãããããã«èŠããŸãã å®éã®ãšã©ãŒã®å Žåãããã°ã©ã ãã¯ã©ãã·ã¥ããå¯èœæ§ããããŸãã
åæ§ã®å ŽæïŒ
- V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããcallback_nameããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ5007ã5031ãbasic_functions.c 5007
é°æ¹¿ãªæé©å
V597ã³ã³ãã€ã©ãŒã¯ããæçµããããã¡ãŒããã©ãã·ã¥ããããã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã php_crypt_r.c 421
/* * MD5 password encryption. */ char* php_md5_crypt_r(const char *pw,const char *salt, char *out) { static char passwd[MD5_HASH_MAX_LEN], *p; unsigned char final[16]; .... /* Don't leave anything around in vm they could use. */ memset(final, 0, sizeof(final)); //<== return (passwd); }
æçµçãªé åã«ã¯ãã©ã€ããŒããã¹ã¯ãŒãæ å ±ãå«ããããšãã§ããŸãããã®æ å ±ã¯ãŒãã«ãªã»ãããããŸãããmemseté¢æ°ã®åŒã³åºãã¯ã³ã³ãã€ã©ã«ãã£ãŠåé€ãããŸãã ãããçºçããå¯èœæ§ã®ããçç±ãšå±éºãªçç±ã®è©³çŽ°ã«ã€ããŠã¯ãèšäºã ã¡ã¢ãªã®äžæžã-çç± ãããã³V597蚺æã®èª¬æãåç §ããŠãã ãã ã
åæ§ã®å ŽæïŒ
- V597ã³ã³ãã€ã©ãŒã¯ããæçµããããã¡ãŒããã©ãã·ã¥ããããã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã php_crypt_r.c 421
- V597ã³ã³ãã€ã©ãŒã¯ããåºåããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt.c 214
- V597ã³ã³ãã€ã©ãŒã¯ããtemp_resultããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha512.c 622
- V597ã³ã³ãã€ã©ãŒã¯ããctxããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha512.c 625
- V597ã³ã³ãã€ã©ãŒã¯ããalt_ctxããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha512.c 626
- V597ã³ã³ãã€ã©ãŒã¯ããtemp_resultããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha256.c 574
- V597ã³ã³ãã€ã©ãŒã¯ããctxããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha256.c 577
- V597ã³ã³ãã€ã©ãŒã¯ããalt_ctxããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_sha256.c 578
䜿çšããã©ã€ãã©ãªãä¿¡é Œã§ããŸããïŒ
ãµãŒãããŒãã£ã®ã©ã€ãã©ãªããããžã§ã¯ãã®éçºã«å€§ããè²¢ç®ããŠããããããã§ã«å®è£ ãããŠããã¢ã«ãŽãªãºã ãåå©çšã§ããŸããããã®å質ãã¡ã€ã³ãããžã§ã¯ããšåæ§ã«ç£èŠããå¿ èŠããããŸãã ãã®èšäºã®ãããã¯ããã©ãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã®ä¿¡é Œã®åé¡ãåã«æèµ·ããããã«ãããã€ãã®ã©ã€ãã©ãªã®ã»ãã®ããã€ãã®äŸãæããŸãã
PHPã€ã³ã¿ãŒããªã¿ãŒã¯å€ãã®ã©ã€ãã©ãªãŒã䜿çšããŸããããã®äžéšã¯ãèªåçšã«ããããã«æžãæããããŠããŸãã
libsqlite
V579 sqlite3_result_blobé¢æ°ã¯ããã€ã³ã¿ãŒãšãã®ãµã€ãºãåŒæ°ãšããŠåãåããŸãã ééããããããŸããã 3çªç®ã®åŒæ°ã調ã¹ãŸãã sqlite3.c 82631
static void statInit(....) { Stat4Accum *p; .... sqlite3_result_blob(context, p, sizeof(p), stat4Destructor); .... }
ã»ãšãã©ã®å Žåã圌ãã¯ãã€ã³ã¿ã§ã¯ãªããªããžã§ã¯ãã®ãµã€ãºãååŸããããšèããŠããŸããã sizeofïŒ* pïŒãšæžãå¿ èŠããããŸãã
pcrelib
V501 ã|ãã®å·ŠåŽãšå³åŽã«åäžã®å¯æ¬¡åŒãïŒ1 << ucp_gbLïŒãããããŸã æŒç®åã pcre_tables.c 161
const pcre_uint32 PRIV(ucp_gbtable[]) = { (1<<ucp_gbLF), 0, 0, .... (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbL)| //<== (1<<ucp_gbL)|(1<<ucp_gbV)|(1<<ucp_gbLV)|(1<<ucp_gbLVT), //<== (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbV)| (1<<ucp_gbT), .... };
é åã®1ã€ã®èŠçŽ ãèšç®ããåŒã«ã¯ãç¹°ãè¿ãã®1ã€ïŒ1 << ucp_gbLïŒããããŸãã 以äžã®ã³ãŒãããå€æãããšãucp_gbLå€æ°ã®1ã€ã¯ucp_gbTãšåŒã°ããããšãããã°ãåã«äžèŠãªããšããããŸãã
PDO
V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããdbhããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªïŒ103ã110ãpdo_dbh.c 103
PDO_API void pdo_handle_error(pdo_dbh_t *dbh, ....) { pdo_error_type *pdo_err = &dbh->error_code; //<== .... if (dbh == NULL || dbh->error_mode == PDO_ERRMODE_SILENT) { return; } .... }
ããã§ã¯ãé¢æ°ã®æåã«çä¿¡ãã€ã³ã¿ã®éåç §ãå®è¡ããããã®åŸãæå¹æ§ããã§ãã¯ãããŸãã
libmagic
V519 ã*ã³ãŒããå€æ°ã«ã¯ãå€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªïŒ100ã101ãencoding.c 101
protected int file_encoding(...., const char **code, ....) { if (looks_ascii(buf, nbytes, *ubuf, ulen)) { .... } else if (looks_utf8_with_BOM(buf, nbytes, *ubuf, ulen) > 0) { DPRINTF(("utf8/bom %" SIZE_T_FORMAT "u\n", *ulen)); *code = "UTF-8 Unicode (with BOM)"; *code_mime = "utf-8"; } else if (file_looks_utf8(buf, nbytes, *ubuf, ulen) > 1) { DPRINTF(("utf8 %" SIZE_T_FORMAT "u\n", *ulen)); *code = "UTF-8 Unicode (with BOM)"; //<== *code = "UTF-8 Unicode"; //<== *code_mime = "utf-8"; } else if (....) { .... } }
ãšã³ã³ãŒããå€æ°ã«2åèšå®ãããšã1è¡ã¯äžèŠã«ãªããããã°ã©ã ã®åäœãããã«äžé©åã«ãªãå¯èœæ§ããããŸãã
ãããã«
PHPã¯é·ãéååšããŠããã人æ°ããããšããäºå®ã«ããããããããã®çš®ã®ãããžã§ã¯ãã¯ããããããŸããŸãªã¢ãã©ã€ã¶ãŒã«ãã£ãŠãã§ãã¯ãããŸããããã®ã³ãŒããšäœ¿çšãããã©ã€ãã©ãªã«çãããå ŽæãèŠã€ãããŸããã
éçåæãå®æçã«äœ¿çšããããšã§ããã䟿å©ãªã¿ã¹ã¯ã解決ããããã«å€ãã®æéãç¯çŽã§ããŸãã
ãã®èšäºã¯è±èªã§ãã
è±èªã話ãèŽè¡ãšãã®èšäºãå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSvyatoslav Razmyslovã PHPã®åæã«é¢ããæçš¿ ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§ãããã«å¯ŸããåçãåéããŸããïŒ PVS-Studioããã³CppCatããŒãžã§ã³2014ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã