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 - просто модные слова или
способ повысить качество ПО?
Примеры SQL-инъекции
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
Примеры SQL-инъекции
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
Mobile Top 10 2016-Top 10
•
M1-Improper Platform Usage
•
M2-Insecure Data Storage
•
M3-Insecure Communication
•
M4-Insecure Authentication
•
M5-Insufficient Cryptography
•
M6-Insecure Authorization
•
M7-Poor Code Quality
•
M8-Code Tampering
•
M9-Reverse Engineering
•
M10-Extraneous Functionality
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
Improper Platform Usage
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
Выводы
•
В «безопасности» нет никакой магии.
•
Но вы должны знать хотя бы ключевые слова и понимать о чем
речь.
•
Также полезно знать про инструменты, которые помогут искать
проблемы безопасности в коде приложений.
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
Q&A
Скачайте PVS-Studio и проверьте свой проект
на программные ошибки и проблемы безопасности!
C, C++, C#, Java
www.viva64.com
CWE, CERT, MISRA, OWASP - просто модные слова или
способ повысить качество ПО?
CWE, CERT, MISRA, OWASP - just fancy words or the way to increase the software quality?