antirez / antirez/smaz

Memory corruption bugs

Aperta
#17 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
C
Stelle
1.2k
Fork
133
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Hi, I'm not sure if this library is still maintained but there are a few memory OOB issues in `smaz_decompress`. In particular, it takes both an input buffer and length, but it will read out of bounds on the input in the following cases:

### 1. Ending with `0xff`

The byte `0xff` marks a verbatim string, `smaz_decompress` unconditionally reads the next input character to find the length.

### 2. Ending with `0xfe`

Similarly byte `0xfe` marks a verbatim byte, the next character is unconditionally written to the output.

E.g. see the following testcase:

**testcase.cpp**
```cpp
#include
#include
#include
extern "C" {
#include "smaz.h"
}
int main(){
const char input[1] = {(char)0xFF}; // malformed SMAZ: 0xFF verbatim marker but no length byte follows
char out[16];
// OOB read occurs in smaz_decompress when it reads *(c+1) with inlen==1
int ret = smaz_decompress((char*)input, 1, out, (int)sizeof(out));
printf("ret=%d\n", ret);
return 0;
}
```

**crash report**
```
==12==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fea1be00021 at pc 0x55d1c068a2b4 bp 0x7ffc0ba41e80 sp 0x7ffc0ba41e78
READ of size 1 at 0x7fea1be00021 thread T0
#0 0x55d1c068a2b3 in smaz_decompress /fuzz/src/smaz.c:173:24
#1 0x55d1c06894c7 in main /fuzz/workspace/test.cpp:11:15
#2 0x7fea1dad8d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#3 0x7fea1dad8e3f in __libc_start_main csu/../csu/libc-start.c:392:3
#4 0x55d1c05ae2e4 in _start (/fuzz/workspace/test+0x362e4) (BuildId: 7062a534da1f8ed21167ac5d16ee4b9523676d2f)

Address 0x7fea1be00021 is located in stack of thread T0 at offset 33 in frame
#0 0x55d1c06893ef in main /fuzz/workspace/test.cpp:7

This frame has 2 object(s):
[32, 33) 'input' (line 8) <== Memory access at offset 33 overflows this variable
[48, 64) 'out' (line 9)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow /fuzz/src/smaz.c:173:24 in smaz_decompress
Shadow bytes around the buggy address:
0x7fea1bdffd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1bdffe00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1bdffe80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1bdfff00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1bdfff80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x7fea1be00000: f1 f1 f1 f1[01]f2 00 00 f3 f3 f3 f3 00 00 00 00
0x7fea1be00080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1be00100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1be00180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1be00200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7fea1be00280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
```

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.