1.10, Comdiv (ok), 11:36, 12/07/2017 [ответить] [﹢﹢﹢] [ · · · ]
| +2 +/– |
Посмотрел исправление уязвимости в Nginx:
>+if (size > NGX_MAX_OFF_T_VALUE - (end - start)) {
>+ return NGX_HTTP_RANGE_NOT_SATISFIABLE;
>+}
>
> size += end - start;
И обратил внимание, на то как выводятся start и end.
>while (*p >= '0' && *p <= '9') {
> if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) {
> return NGX_HTTP_RANGE_NOT_SATISFIABLE;
> }
> start = start * 10 + *p++ - '0';
>}
Всё бы хорошо, проверка переполнения есть, но в конечном вычислении допущена ошибка
> start = start * 10 + *p++ - '0';
что приводит к неопределённому поведению, поскольку start - знаковое целое.
Возможно, nginx компилируют исключительно с флагом -fwrapv, и тогда этот код можно считать корректным, но если опираться исключительно на стандарт языка Си, то должно быть так:
> start = start * 10 + (*p++ - '0');
или так:
> start = *p++ - '0' + start * 10; | |
|
2.13, Аноним (-), 11:58, 12/07/2017 [^] [^^] [^^^] [ответить]
| –3 +/– |
Си нестандартизирован это многолетние мракобесие с хаками к неопределенному поведению языка при компияции.
| |
|
3.15, Comdiv (ok), 12:05, 12/07/2017 [^] [^^] [^^^] [ответить]
| +2 +/– |
Не совсем. Си стандартизирован и неопределённое поведение часть этого стандарта.
| |
|
|
5.19, 1 (??), 16:44, 12/07/2017 [^] [^^] [^^^] [ответить]
| +4 +/– |
Забивание гвоздей микроскопом - нестандартизировано (неизвестно каким видом микроскопа забивать гвозди - оптическим, ренгеновским и т.п.)
| |
|
|
|
2.14, Аноним (-), 12:01, 12/07/2017 [^] [^^] [^^^] [ответить]
| +/– |
>[оверквотинг удален]
>>}
> Всё бы хорошо, проверка переполнения есть, но в конечном вычислении допущена ошибка
>> start = start * 10 + *p++ - '0';
> что приводит к неопределённому поведению, поскольку start - знаковое целое.
> Возможно, nginx компилируют исключительно с флагом -fwrapv, и тогда этот код можно
> считать корректным, но если опираться исключительно на стандарт языка Си, то
> должно быть так:
>> start = start * 10 + (*p++ - '0');
> или так:
>> start = *p++ - '0' + start * 10;
https://blog.regehr.org/archives/1520
| |
|
3.18, Comdiv (ok), 14:33, 12/07/2017 [^] [^^] [^^^] [ответить]
| +1 +/– |
Я ничего не перепутал. В этом месте
> (start * 10 + *p++) - '0'
возможно переполнение, так как условие
> if (start >= cutoff && (start > cutoff || *p - '0' > cutlim))
проверяет корректность такого кода:
> start * 10 + (*p++ - '0') | |
|
2.21, нах (?), 18:58, 12/07/2017 [^] [^^] [^^^] [ответить]
| +/– |
в рассылку-то отписались? Вряд ли Макс читает опеннет.
| |
|
3.23, Comdiv (ok), 15:52, 20/07/2017 [^] [^^] [^^^] [ответить]
| +/– |
Это здорово, но я не уверен, что проблем совсем не осталось. Например,
> while (*fmt >= '0' && *fmt <= '9') {
> width = width * 10 + (*fmt++ - '0');
> }
не проверяет возможность переполнения, и вообще, адекватность полученного числа. width беззнаковый, поэтому неопределённого поведения тут нет, но, возможно, на всякий случай, стоит вставить проверку, чтобы точно избежать проблем в других местах.
| |
|
|
|