Software quality assurance days 24 Международная конференция по вопросам качества ПО sqadays.com Москва. 23–24 ноября 2018 Евгений Рыжков PVS-Studio. Тула, Россия CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество программного обеспечения?
Кто я? Евгений Рыжков – руководитель и сооснователь PVS-Studio; Год основания компании: 2008; Офис - г. Тула (200 км от Москвы), штат 20+ человек; PVS-Studio – статический анализатор кода. Ищет ошибки в коде на C, C++, C# и Java. Работает на Windows, Linux и macOS. CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? Содержание SAST : Static Application Security Testing; CWE : Common Weakness Enumeration; CVE : Common Vulnerabilities and Exposures; SEI CERT Coding Standards. MISRA : Motor Industry Software Reliability Association. OWASP : Open Web Application Security Project
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? Зачем нам все это знать? Чтобы больше зарабатывать денег! DevOps = системный администратор + программист QA = тестировщик + программист Security Researcher, Security Specialist, SecOps = security anything + программист
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? SAST: Static Application Security Testing Есть «обычный» статический анализ кода, который ищет «обычные» ошибки в программах. Кто бы мог подумать (сарказм), но проблемы безопасности и уязвимости в большинстве случаев происходят из-за ошибок в программах. Что если есть связь между ошибками и проблемами безопасности?
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? Связь и есть CWE – потенциальные уязвимости CVE – подтвержденные уязвимости
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? Вот и весь SAST! Но давайте разбираться на примерах, что такое CWE и CVE.
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? CWE : Common Weakness Enumeration CWE™  is a community-developed list of common software security weaknesses.  Важно понимать, что это потенциальные уязвимости, которые могут стать реальными. А могут и не стать. Сайт: https://cwe.mitre.org CWE List Version 3.1 содержит 716 потенциальных уязвимостей.
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО? Рассмотрим примеры CWE-570\571: Expression is Always False\True CWE-467: Use of sizeof() on a Pointer Type CWE-476: NULL Pointer Dereference CWE-14: Compiler Removal of Code to Clear Buffers CWE-369: Divide By Zero CWE-20: Improper Input Validation
CWE-570: Expression is Always False #define BIT_READ 0x0001 #define BIT_WRITE 0x0010 unsigned int mask = BIT_READ & BIT_WRITE ; int hasReadWriteAccess( unsigned int userMask) { if (userMask & mask) { return 1; } return 0; } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-570: Expression is Always False #define BIT_READ 0x0001 #define BIT_WRITE 0x0010 unsigned int mask = BIT_READ & BIT_WRITE ; // 00000000 int hasReadWriteAccess(unsigned int userMask) { if (userMask & mask) { // always false return 1; } return 0; } '&' -> '|' CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-14: Compiler Removal of Code to Clear Buffers void GetData( char *MFAddr) { char pwd[64]; if (GetPasswordFromUser(pwd, sizeof (pwd))) { if (ConnectToMainframe(MFAddr, pwd)) { // Interaction with mainframe .... } } memset(pwd, 0, sizeof (pwd)); // <= } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-14: Compiler Removal of Code to Clear Buffers int mlx5_core_create_qp(....) { struct mlx5_destroy_qp_mbox_out dout; err_cmd: .... memset(&dout, 0, sizeof (dout)); // <= .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-20: Improper Input Validation int c = getchar(); if (c < 0) { if (fgets(command_buf, sizeof (command_buf) - 1, stdin ) != command_buf) { break ; } command_buf[strlen(command_buf)-1] = '\0' ; /* remove endline */ break ; } Посмотрим к чему приводит эта проблема в FreeSWITCH? CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-20: Improper Input Validation int c = getchar(); if (c < 0) { if (fgets(command_buf, sizeof (command_buf) - 1, stdin ) != command_buf) { break ; } command_buf[strlen(command_buf)-1] = '\0'; /* remove endline */ break; } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-20: Improper Input Validation int c = getchar(); if (c < 0) { if (fgets(command_buf, sizeof(command_buf) - 1, stdin) != command_buf) { break; } command_buf[strlen(command_buf)-1] = '\0' ; /* remove endline */ break ; } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CWE-20: Improper Input Validation int c = getchar(); if (c < 0) { if (fgets(command_buf, sizeof(command_buf) - 1 , stdin ) != command_buf) { break; } command_buf[strlen(command_buf)-1] = '\0' ; /* remove endline */ break; } '\0' 0 -1 CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE: Common Vulnerabilities and Exposures CVE - реальные уязвимости, найденные в приложениях. Основной сайт: https://cve.mitre.org/ Total CVE Entries: 108 581 Также интересно: https://www.cvedetails.com/ Для маньяков: https://twitter.com/CVEnew CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15232 METHODDEF ( void ) quantize_ord_dither (...., JSAMPARRAY output_buf, int num_rows) { .... for (row = 0; row < num_rows; row++) { jzero_far(( void *) output_buf[row], ( size_t ) (width * sizeof ( JSAMPLE ))); .... } .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15232 METHODDEF ( void ) quantize_ord_dither (...., JSAMPARRAY output_buf, int num_rows) { .... for (row = 0; row < num_rows; row++) { jzero_far((void *) output_buf[row], (size_t) (width * sizeof(JSAMPLE))); .... } .... } null pointer CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15232 METHODDEF ( void ) quantize_ord_dither (...., JSAMPARRAY output_buf, int num_rows) { .... if (output_buf == NULL && num_rows) { ERREXIT (cinfo, JERR_BAD_PARAM ); } for (row = 0; row < num_rows; row++) { jzero_far((void *) output_buf[row] , (size_t) (width * sizeof(JSAMPLE))); .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2015-8617 static void zend_throw_or_error( int fetch_type, zend_class_entry *exception_ce, const char *format, ...) { .... if (fetch_type & ZEND_FETCH_CLASS_EXCEPTION ) { zend_throw_error(exception_ce, message); } else { zend_error( E_ERROR , "%s" , message); } .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2015-8617 static void zend_throw_or_error( int fetch_type, zend_class_entry *exception_ce, const char *format, ...) { .... if (fetch_type & ZEND_FETCH_CLASS_EXCEPTION) { zend_throw_error(exception_ce, "%s" , message); } else { zend_error(E_ERROR, "%s", message); } .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15025 static .... decode_line_info (....) { .... case DW_LNS_const_add_pc: if (lh.maximum_ops_per_insn == 1) address += (lh.minimum_instruction_length * ((255 - lh.opcode_base) / lh.line_range)); .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15025 static .... decode_line_info (....) { .... case DW_LNS_const_add_pc: if (lh.maximum_ops_per_insn == 1) address += (lh.minimum_instruction_length * ((255 - lh.opcode_base) / lh.line_range)); .... } 0 CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2017-15025 static .... decode_line_info (....) { .... case DW_LNS_const_add_pc: if (lh.line_range == 0) goto line_fail; if (lh.maximum_ops_per_insn == 1) address += (lh.minimum_instruction_length * ((255 - lh.opcode_base) / lh.line_range )); .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2015-8948 else if (fgets (readbuf, BUFSIZ , stdin ) == NULL ) { .... } if (readbuf[strlen (readbuf) - 1] == '\n' ) readbuf[strlen (readbuf) - 1] = '\0' ; CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2015-8948 else if ( fgets (readbuf, BUFSIZ, stdin ) == NULL ) { .... } if ( readbuf[strlen (readbuf) - 1] == '\n' ) readbuf[strlen (readbuf) - 1] = '\0'; "\0" -1 CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2016-6262 else if (getline (&line, &linelen, stdin ) == -1) { .... } if (line[strlen (line) - 1] == '\n' ) line[strlen (line) - 1] = '\0' ; CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2016-6262 else if ( getline (&line, &linelen , stdin ) == -1 ) { .... } if ( line[strlen (line) - 1] == '\n' ) line[strlen (line) - 1] = '\0'; "\0" -1 CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
CVE-2016-6262 else if (getline (&line, &linelen, stdin) == -1) { .... } if (strlen (line) > 0) if (line[strlen (line) - 1] == '\n' ) line[strlen (line) - 1] = '\0'; CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
Два подхода к поиску уязвимостей Можно (и нужно) искать потенциальные уязвимости, которые могут привести к реальным проблемам при написании нового кода. Можно искать по базе существующих известных уязвимостей в своем имеющемся коде (с помощью автоматизированных средств). CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
MISRA C 2012 и MISRA C++ 2008 Закрытый стандарт кодирования. Доступен только за деньги. Это не про ошибки, а про то как писать код так, чтобы ошибок и проблем в целом было поменьше. Анализаторы, проверяющие соответствие MISRA, не ищут ошибки. Стандарт состоит из правил, которые помогли бы писать более безопасный код. Хотя если взглянуть на правила первый раз, они могут показаться странными. CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
Примеры рекомендаций из MISRA Каждый 'switch' должен содержать 'default'. Возвращаемое значение non-void функций должно быть использовано. Функция должна иметь одну точку выхода. Указатели должны иметь не более 2-х уровней вложенности. Тела циклов и условных выражений должны быть заключены в {}. Каждый 'if ... else if' должен иметь завершающий 'else'. Не использовать unions. CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
The goto statement should not be used for (x = 0; FEATURES[x].name; x++) { if (all || !ns || ! strcasecmp (ns, FEATURES[x].name)) { if (!(tag = iks_insert (query, "feature" ))) { goto fail; // <= } iks_insert_attrib(tag, "var" , FEATURES[x].name); } } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
All if ... else if constructs shall be terminated with an else statement if (! strcasecmp (type, "unavailable" )) { dl_signal = LDL_SIGNAL_PRESENCE_OUT; } else if (! strcasecmp (type, "probe" )) { dl_signal = LDL_SIGNAL_PRESENCE_PROBE; } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
All if ... else if constructs shall be terminated with an else statement if (! strcasecmp (type, "unavailable" )) { dl_signal = LDL_SIGNAL_PRESENCE_OUT; } else if (! strcasecmp (type, "probe" )) { dl_signal = LDL_SIGNAL_PRESENCE_PROBE; } else { // Do something... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
A function should have a single point of exit at the end static iks * working_find( iks *tag, const char *name) { while (tag) { if (! strcasecmp (iks_name(tag), name)) { return tag; // <= } tag = iks_next_tag(tag); } return NULL ; // <= } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
Dynamic heap memory allocation shall not be used void clearSpline() { for ( int i = 0; i < splinePoints.Num(); i++ ) { delete splinePoints[i]; // <= } splinePoints.Clear(); } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
Octal constants shall not be used if (!(ch & 0200)) { // <= .... } else { if ((ch & 0300) != 0300) { // <= x2 .... } else { mask = 0340; // <= .... } .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
SEI CERT Coding Standard Carnegie Mellon University, Software Engineering Institute; CERT – computer emergency response team; Есть стандарты для C, C++, Java, Perl, Android CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
EXP34-C. Do not dereference null pointers, C/C++ #include <png.h> /* From libpng */ #include <string.h> void func(png_structp png_ptr, int length, const void *user_data) { png_charp chunkdata; chunkdata = (png_charp)png_malloc(png_ptr, length + 1); /* ... */ memcpy (chunkdata, user_data, length); // chunkdata may be NULL /* ... */ } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
INT33-C. Ensure that division and remainder operations do not result in divide-by-zero errors #include <limits.h> void func( signed long s_a, signed long s_b) { signed long result; if ((s_a == LONG_MIN) && (s_b == -1)) { /* Handle error */ } else { result = s_a / s_b; // << } /* ... */ } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
EXP12-C. Do not ignore values returned by functions int main(int argc, char **argv) { .... QByteArray arg(argv[a]); .... arg = arg. mid (1); arg. toLower (); // << if (arg == "o") .... } CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
OWASP: Open Web Application Security Project OWASP Top 10 The Ten Most Critical Web Application Security Risks OWASP Mobile Top 10 Risks OWASP Mobile Security Project CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?
OWASP Top 10 – 2017 A1:2017- Injection A2:2017-Broken Authentication A3:2017- Sensitive Data Exposure A4:2017-XML External Entities (XXE) A5:2017-Broken Access Control A6:2017-Security Misconfiguration A7:2017- Cross-Site Scripting (XSS) A8:2017- Insecure Deserialization A9:2017-Using Components with Known Vulnerabilities A10:2017- Insufficient Logging & Monitoring CWE, CERT, MISRA, OWASP - просто модные слова или способ повысить качество ПО?