Skip to content

Fix negative-size-param crash when OBJ_obj2txt() fails#21008

Open
ndossche wants to merge 1 commit intophp:masterfrom
ndossche:clesss-6
Open

Fix negative-size-param crash when OBJ_obj2txt() fails#21008
ndossche wants to merge 1 commit intophp:masterfrom
ndossche:clesss-6

Conversation

@ndossche
Copy link
Copy Markdown
Member

@ndossche ndossche commented Jan 22, 2026

When the function returns -1, the length passed to the string constructor is negative:

==188567==ERROR: AddressSanitizer: negative-size-param: (size=-1)
    #0 0x7f36ea0305bd in memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc:115
    #1 0x559c568a05b3 in zend_string_init /work/php-src/Zend/zend_string.h:191
    #2 0x559c568b3cb7 in add_assoc_stringl_ex /work/php-src/Zend/zend_API.c:1986
    #3 0x559c559234a2 in add_assoc_stringl /work/php-src/Zend/zend_API.h:579
    #4 0x559c55928b3e in php_openssl_pkey_get_details /work/php-src/ext/openssl/openssl_backend_v3.c:671
    #5 0x559c559006d4 in zif_openssl_pkey_get_details /work/php-src/ext/openssl/openssl.c:2319
    #6 0x559c566b7ed2 in zend_test_execute_internal /work/php-src/ext/zend_test/observer.c:306
    #7 0x559c569e024a in ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER /work/php-src/Zend/zend_vm_execute.h:2154
    #8 0x559c56b40995 in execute_ex /work/php-src/Zend/zend_vm_execute.h:116519
    #9 0x559c56b558b0 in zend_execute /work/php-src/Zend/zend_vm_execute.h:121962
    #10 0x559c56cba0ab in zend_execute_script /work/php-src/Zend/zend.c:1980
    #11 0x559c566ec8bb in php_execute_script_ex /work/php-src/main/main.c:2645
    #12 0x559c566ecccb in php_execute_script /work/php-src/main/main.c:2685
    #13 0x559c56cbfc16 in do_cli /work/php-src/sapi/cli/php_cli.c:951
    #14 0x559c56cc21e3 in main /work/php-src/sapi/cli/php_cli.c:1362
    #15 0x7f36e932d1c9  (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e)
    #16 0x7f36e932d28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e)
    #17 0x559c55809b34 in _start (/work/php-src/build-dbg-asan/sapi/cli/php+0x609b34) (BuildId: aa149f943514fff0c491e1f199e30fed0e977f7c)

This was found by a hybrid static-dynamic analyser that looks for inconsistent handling of error checks in bindings.

When the function returns -1, the length passed to the string
constructor is negative:

```
==188567==ERROR: AddressSanitizer: negative-size-param: (size=-1)
    #0 0x7f36ea0305bd in memcpy ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc:115
    #1 0x559c568a05b3 in zend_string_init /work/php-src/Zend/zend_string.h:191
    #2 0x559c568b3cb7 in add_assoc_stringl_ex /work/php-src/Zend/zend_API.c:1986
    #3 0x559c559234a2 in add_assoc_stringl /work/php-src/Zend/zend_API.h:579
    #4 0x559c55928b3e in php_openssl_pkey_get_details /work/php-src/ext/openssl/openssl_backend_v3.c:671
    #5 0x559c559006d4 in zif_openssl_pkey_get_details /work/php-src/ext/openssl/openssl.c:2319
    #6 0x559c566b7ed2 in zend_test_execute_internal /work/php-src/ext/zend_test/observer.c:306
    #7 0x559c569e024a in ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER /work/php-src/Zend/zend_vm_execute.h:2154
    #8 0x559c56b40995 in execute_ex /work/php-src/Zend/zend_vm_execute.h:116519
    #9 0x559c56b558b0 in zend_execute /work/php-src/Zend/zend_vm_execute.h:121962
    #10 0x559c56cba0ab in zend_execute_script /work/php-src/Zend/zend.c:1980
    #11 0x559c566ec8bb in php_execute_script_ex /work/php-src/main/main.c:2645
    #12 0x559c566ecccb in php_execute_script /work/php-src/main/main.c:2685
    #13 0x559c56cbfc16 in do_cli /work/php-src/sapi/cli/php_cli.c:951
    #14 0x559c56cc21e3 in main /work/php-src/sapi/cli/php_cli.c:1362
    #15 0x7f36e932d1c9  (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e)
    #16 0x7f36e932d28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 274eec488d230825a136fa9c4d85370fed7a0a5e)
    #17 0x559c55809b34 in _start (/work/php-src/build-dbg-asan/sapi/cli/php+0x609b34) (BuildId: aa149f943514fff0c491e1f199e30fed0e977f7c)
```
@ndossche
Copy link
Copy Markdown
Member Author

ndossche commented Mar 5, 2026

Actually noticed via another report that if OBJ_obj2txt returns 0 (which it can on failure) that the failure is not propagated either. So I may need to adjust this PR.

add_assoc_stringl(&ary, "curve_oid", oir_buf, oir_len);
ASN1_OBJECT_free(obj);
if (oir_len < 0) {
ktype = -2;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As this is unlikely to happen, I'm not sure we should add new ktype...

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In an ideal world we'd have an ADT type like in Rust to signal an error and then we don't need such magic numbers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what I'm saying is that this fails only on low memory because that obj is from known nid that is for valid curve name so the only case where this fail would be malloc and freinds failure as far as I see. In such case the process will most likely get killed soon so don't think we need to document new error type for this...

@bukka
Copy link
Copy Markdown
Member

bukka commented Apr 4, 2026

Actually noticed via another report that if OBJ_obj2txt returns 0 (which it can on failure) that the failure is not propagated either. So I may need to adjust this PR.

I don't think this is possible because obj has to be valid at this stage and the only case where 0 as far as I see is returned is here (a is the obj):

    if (a == NULL || a->data == NULL)
        return 0;

I might be missing something though...

@ndossche
Copy link
Copy Markdown
Member Author

ndossche commented Apr 4, 2026

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants