secp256k1 icon indicating copy to clipboard operation
secp256k1 copied to clipboard

False positives in constant-time tests when using MSan on Clang >= 16

Open real-or-random opened this issue 2 months ago • 0 comments

(Description partly copied from https://github.com/bitcoin-core/secp256k1/pull/1512#issuecomment-2045254282)

The default of what is considered a "use" of uninitialized memory was changed in clang 16. Returning an uninitialized variables from a function, or passing uninitialized values to a function as a parameter is now considered, and MSan will report it by default. See the Clang 16.0.09 Release Notes:

-fsanitize-memory-param-retval is turned on by default. With -fsanitize=memory, passing uninitialized variables to functions and returning uninitialized variables from functions is more aggressively reported. -fno-sanitize-memory-param-retval restores the previous behavior.

This makes sense for actual memory checking, in the sense that uninitialized memory at the boundary of a function call should probably be considered a bug or at least a smell. But that's certainly not what we want if we (ab)use MSan for constant-time checking, and this gives us false positives.

We should pass -fno-sanitize-memory-param-retval to clang >=16, but probably only for the ctime_test target.

Example false positives, `clang version 17.0.6` on d8311688bd383d3a923a1b11789cded3cc8e5e03, and `./configure --enable-dev-mode CFLAGS='-fsanitize=memory -fsanitize-recover=memory -g'`:
> ./ctime_tests
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094683e2fa in secp256k1_ecdsa_sign_inner /home/tim/bs/dev/secp256k1/src/secp256k1.c:544:5
    #1 0x77094683c06f in secp256k1_ecdsa_sign /home/tim/bs/dev/secp256k1/src/secp256k1.c:556:11
    #2 0x5cb76630a11f in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:106:11
    #3 0x5cb76630a11f in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #4 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:544:5 in secp256k1_ecdsa_sign_inner
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094685787c in secp256k1_ecdh /home/tim/bs/dev/secp256k1/src/modules/ecdh/main_impl.h:69:1
    #1 0x5cb76630a1bd in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:115:11
    #2 0x5cb76630a1bd in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ecdh/main_impl.h:69:1 in secp256k1_ecdh
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094683e2fa in secp256k1_ecdsa_sign_inner /home/tim/bs/dev/secp256k1/src/secp256k1.c:544:5
    #1 0x77094685aadf in secp256k1_ecdsa_sign_recoverable /home/tim/bs/dev/secp256k1/src/modules/recovery/main_impl.h:132:11
    #2 0x5cb76630a232 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:123:11
    #3 0x5cb76630a232 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #4 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:544:5 in secp256k1_ecdsa_sign_inner
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094683e43f in secp256k1_ec_seckey_verify /home/tim/bs/dev/secp256k1/src/secp256k1.c:570:1
    #1 0x5cb76630a2e7 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:132:11
    #2 0x5cb76630a2e7 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:570:1 in secp256k1_ec_seckey_verify
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094683f05a in secp256k1_ec_seckey_negate /home/tim/bs/dev/secp256k1/src/secp256k1.c:618:1
    #1 0x5cb76630a343 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:137:11
    #2 0x5cb76630a343 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:618:1 in secp256k1_ec_seckey_negate
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946840027 in secp256k1_ec_seckey_tweak_add_helper /home/tim/bs/dev/secp256k1/src/secp256k1.c:648:5
    #1 0x77094683f6ed in secp256k1_ec_seckey_tweak_add /home/tim/bs/dev/secp256k1/src/secp256k1.c:659:12
    #2 0x5cb76630a3b7 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:143:11
    #3 0x5cb76630a3b7 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #4 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:648:5 in secp256k1_ec_seckey_tweak_add_helper
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094683fb54 in secp256k1_ec_seckey_tweak_add /home/tim/bs/dev/secp256k1/src/secp256k1.c:665:1
    #1 0x5cb76630a3b7 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:143:11
    #2 0x5cb76630a3b7 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:665:1 in secp256k1_ec_seckey_tweak_add
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946840dc4 in secp256k1_ec_seckey_tweak_mul /home/tim/bs/dev/secp256k1/src/secp256k1.c:713:1
    #1 0x5cb76630a42b in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:149:11
    #2 0x5cb76630a42b in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:713:1 in secp256k1_ec_seckey_tweak_mul
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094685fd09 in secp256k1_keypair_create /home/tim/bs/dev/secp256k1/src/modules/extrakeys/main_impl.h:212:1
    #1 0x5cb76630a48f in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:156:11
    #2 0x5cb76630a48f in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/extrakeys/main_impl.h:212:1 in secp256k1_keypair_create
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946840027 in secp256k1_ec_seckey_tweak_add_helper /home/tim/bs/dev/secp256k1/src/secp256k1.c:648:5
    #1 0x770946860c1a in secp256k1_keypair_xonly_tweak_add /home/tim/bs/dev/secp256k1/src/modules/extrakeys/main_impl.h:273:12
    #2 0x5cb76630a4f6 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:162:11
    #3 0x5cb76630a4f6 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #4 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/secp256k1.c:648:5 in secp256k1_ec_seckey_tweak_add_helper
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x77094685fd09 in secp256k1_keypair_create /home/tim/bs/dev/secp256k1/src/modules/extrakeys/main_impl.h:212:1
    #1 0x5cb76630a5ce in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:175:11
    #2 0x5cb76630a5ce in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/extrakeys/main_impl.h:212:1 in secp256k1_keypair_create
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946863ca2 in secp256k1_schnorrsig_sign_internal /home/tim/bs/dev/secp256k1/src/modules/schnorrsig/main_impl.h:193:1
    #1 0x7709468619ab in secp256k1_schnorrsig_sign32 /home/tim/bs/dev/secp256k1/src/modules/schnorrsig/main_impl.h:197:12
    #2 0x5cb76630a630 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:178:11
    #3 0x5cb76630a630 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #4 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/schnorrsig/main_impl.h:193:1 in secp256k1_schnorrsig_sign_internal
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946871648 in secp256k1_ellswift_create /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:487:1
    #1 0x5cb76630a693 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:185:11
    #2 0x5cb76630a693 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:487:1 in secp256k1_ellswift_create
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x770946871648 in secp256k1_ellswift_create /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:487:1
    #1 0x5cb76630a6f7 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:190:11
    #2 0x5cb76630a6f7 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:487:1 in secp256k1_ellswift_create
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7709468770b2 in secp256k1_ellswift_xdh /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1
    #1 0x5cb76630a7af in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:197:15
    #2 0x5cb76630a7af in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1 in secp256k1_ellswift_xdh
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7709468770b2 in secp256k1_ellswift_xdh /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1
    #1 0x5cb76630a84c in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:203:15
    #2 0x5cb76630a84c in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1 in secp256k1_ellswift_xdh
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7709468770b2 in secp256k1_ellswift_xdh /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1
    #1 0x5cb76630a8e0 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:197:15
    #2 0x5cb76630a8e0 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1 in secp256k1_ellswift_xdh
==18035==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7709468770b2 in secp256k1_ellswift_xdh /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1
    #1 0x5cb76630a979 in run_tests /home/tim/bs/dev/secp256k1/src/ctime_tests.c:203:15
    #2 0x5cb76630a979 in main /home/tim/bs/dev/secp256k1/src/ctime_tests.c:57:5
    #3 0x770946518ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #4 0x770946518d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x5cb766271254 in _start (/home/tim/bs/dev/secp256k1/.libs/ctime_tests+0x31254) (BuildId: b302b3c7acd04fb3473e01ac13d3e3e0eb931f49)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/tim/bs/dev/secp256k1/src/modules/ellswift/main_impl.h:588:1 in secp256k1_ellswift_xdh
MemorySanitizer: 18 warnings reported.

cc @hebasto

real-or-random avatar Apr 09 '24 14:04 real-or-random