Re: BUG #18925: Heap-buffer-overflow: pglz_compress with pglz_stategy_always - Mailing list pgsql-bugs

From Dilip Kumar
Subject Re: BUG #18925: Heap-buffer-overflow: pglz_compress with pglz_stategy_always
Date
Msg-id CAFiTN-sSx4Xx=0bm4D_hfSs5XUtNs25T6SBeiCnn4xiFVK_scg@mail.gmail.com
Whole thread Raw
In response to BUG #18925: Heap-buffer-overflow: pglz_compress with pglz_stategy_always  (PG Bug reporting form <noreply@postgresql.org>)
Responses Re: BUG #18925: Heap-buffer-overflow: pglz_compress with pglz_stategy_always
List pgsql-bugs
On Tue, May 13, 2025 at 7:34 PM PG Bug reporting form
<noreply@postgresql.org> wrote:
>
> The following bug has been logged on the website:
>
> Bug reference:      18925
> Logged by:          Stanislav Osipov
> Email address:      stasos24@gmail.com
> PostgreSQL version: 17.5
> Operating system:   Ubuntu 22
> Description:
>
> Although pglz_compress is not used with pglz_stategy_always.
> It might be useful in future
> Source code:
> ```
> #include "postgres.h"
> #include "common/pg_lzcompress.h"
> #include "mb/pg_wchar.h"
> #include "utils/memutils.h"
> #include "utils/memdebug.h"
> #include "miscadmin.h"
> extern pg_stack_base_t set_stack_base(void);
> int FuzzerInitialize(char *dbname, char ***argv);
> extern bool             log_checkpoints;
> int LLVMFuzzerInitialize(int *argc, char ***argv) {
>         FuzzerInitialize("compress_db", argv);
>         return 0;
> }
> /*
> ** Main entry point.  The fuzzer invokes this function with each
> ** fuzzed input.
> */
> int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
>         if (size < 1) return 1;
>         log_checkpoints = false;
>         sigjmp_buf local_sigjmp_buf;
>         char *buffer;
>         char *comp;
>         char *decomp;
>         int comp_bytes;
>         buffer = (char *) calloc(size+1, sizeof(char));
>         memcpy(buffer, data, size);
>         comp = (char *) calloc(size+1, sizeof(char));
>         decomp = (char *) calloc(size+1, sizeof(char));
>         MemoryContextInit();
>         set_stack_base();
>         if(!sigsetjmp(local_sigjmp_buf,0)){
>                 error_context_stack = NULL;
>                 comp_bytes = pglz_compress(buffer, size + 1, comp,
> PGLZ_strategy_always);
>                 pglz_decompress(comp, comp_bytes, decomp,
>                                 size+1, false);
>         }
>         free(buffer);
>         free(comp);
>         free(decomp);
>         FlushErrorState();
>         MemoryContextReset(TopMemoryContext);
>         TopMemoryContext->ident = NULL;
>         TopMemoryContext->methods->delete_context(TopMemoryContext);
>         VALGRIND_DESTROY_MEMPOOL(TopMemoryContext);
>         return 0;
> }
> ```
> Input:
> ```
> ZZZ▒ZC
> ```
> Asan Report:
> ==7101==ERROR: AddressSanitizer: heap-buffer-overflow on address
> 0x602000011a3a at pc 0x000002593c29 bp 0x7fff7277f850 sp 0x7fff7277f848
> WRITE of size 1 at 0x602000011a3a thread T0
>     #0 0x2593c28 in pglz_compress /db/src/common/pg_lzcompress.c:656:4
>     #1 0x5751c1 in LLVMFuzzerTestOneInput (/fuzz/compress_fuzzer+0x5751c1)
>     #2 0x4a8d23 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*,
> unsigned long) (/fuzz/compress_fuzzer+0x4a8d23)
>     #3 0x491b6f in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned
> long) (/fuzz/compress_fuzzer+0x491b6f)
>     #4 0x497df0 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char
> const*, unsigned long)) (/fuzz/compress_fuzzer+0x497df0)
>     #5 0x4c3962 in main (/fuzz/compress_fuzzer+0x4c3962)
>     #6 0x7f5b2bf55d8f in __libc_start_call_main
> csu/../sysdeps/nptl/libc_start_call_main.h:58:16
>     #7 0x7f5b2bf55e3f in __libc_start_main csu/../csu/libc-start.c:392:3
>     #8 0x48beb4 in _start (/fuzz/compress_fuzzer+0x48beb4)
> 0x602000011a3a is located 0 bytes to the right of 10-byte region
> [0x602000011a30,0x602000011a3a)
> allocated by thread T0 here:
>     #0 0x540922 in __interceptor_calloc (/fuzz/compress_fuzzer+0x540922)
>     #1 0x5750a1 in LLVMFuzzerTestOneInput (/fuzz/compress_fuzzer+0x5750a1)
>     #2 0x4a8d23 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*,
> unsigned long) (/fuzz/compress_fuzzer+0x4a8d23)
>     #3 0x491b6f in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned
> long) (/fuzz/compress_fuzzer+0x491b6f)
>     #4 0x497df0 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char
> const*, unsigned long)) (/fuzz/compress_fuzzer+0x497df0)
>     #5 0x4c3962 in main (/fuzz/compress_fuzzer+0x4c3962)
>     #6 0x7f5b2bf55d8f in __libc_start_call_main
> csu/../sysdeps/nptl/libc_start_call_main.h:58:16
> SUMMARY: AddressSanitizer: heap-buffer-overflow
> /db/src/common/pg_lzcompress.c:656:4 in pglz_compress
> Shadow bytes around the buggy address:
>   0x0c047fffa2f0: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
>   0x0c047fffa300: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
>   0x0c047fffa310: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
>   0x0c047fffa320: fa fa 00 04 fa fa 00 05 fa fa 00 03 fa fa 00 00
>   0x0c047fffa330: fa fa 00 00 fa fa 00 00 fa fa 00 01 fa fa 00 01
> =>0x0c047fffa340: fa fa 00 02 fa fa 00[02]fa fa 00 02 fa fa fa fa
>   0x0c047fffa350: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c047fffa360: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c047fffa370: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c047fffa380: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c047fffa390: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> 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
> ==7101==ABORTING
>

Do you have a reproducible test case or steps to hit this issue?

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com



pgsql-bugs by date:

Previous
From: Zane Duffield
Date:
Subject: Re: Dependency on ccache in postgresql17-devel-17.5-1PGDG.rhel9
Next
From: 濱中 弘和
Date:
Subject: Re: reltuples decreasing with each autovacuum run