{"uuid": "011d3635-0e6c-4c3a-8c30-5f703dbe4caf", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2025-54957", "type": "published-proof-of-concept", "source": "https://t.me/purp_sec/1370", "content": "\ud83d\udcdd  \u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f 0-click RCE \u0432 Google Pixel 9 (CVE-2025-54957)\n\n\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u044d\u043a\u0441\u043f\u043b\u043e\u0439\u0442 \u043e\u0442 \u043a\u043e\u043b\u043b\u0435\u0433 \u0438\u0437 Project Zero: RCE \u0432 \u0430\u0443\u0434\u0438\u043e\u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0435 Dolby (UDC) \u0447\u0435\u0440\u0435\u0437 Google Messages, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.\n\n\u0421\u0443\u0442\u044c \u0431\u0430\u0433\u0430\n\n\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 libcodec2_soft_ddpdec.so. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 EMDF-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 evo heap \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0435\u0444\u0435\u043a\u0442\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 total_size += (8 - total_size) % total_size. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u0430\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (wraparound). \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u043d\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u0442 \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u0435 \u043f\u0435\u0439\u043b\u043e\u0430\u0434\u0430.\n\n\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u2b07\ufe0f\n\nresult = read_variable_bits(this, 8, &amp;payload_length);\n  if ( !result )\n  {\n    if ( evo_heap )\n    {\n      buffer = ddp_udc_int_evo_malloc(evo_heap, payload_length, param.extra_len);\n      outstruct.buf = buffer;\n      if ( !buffer )\n        return 2;\n      if ( payload_length )\n      {\n        index = 0;\n        while ( !ddp_udc_int_evo_brw_read(this, 8, &amp;byte_read) )\n        {\n          outstruct.buf[index++] = byte_read;\n          if ( index &gt;= payload_length )\n            goto ERROR;\n        }\n        return 10;\n      }\n    }\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438\n\n\u23fa evo_heap \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430. \u041a\u0443\u0447\u0443 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u043e skip pointer.\n\n\u23fa \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0433 \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (WRITE DYNAMIC). \u0410\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0434\u0438\u043e\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.\n\n\u23fa \u0410\u0442\u0430\u043a\u0430 \u043d\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 Scudo. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c curr_chunk_len \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0447\u0430\u043d\u043a\u0438. \u042d\u043d\u0442\u0440\u043e\u043f\u0438\u044f \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0448\u0430\u043d\u0441\u0443 1/16, \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 ~24 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.\n\nRCE\n\nAndroid \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (W^X) \u0438 execmem, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c.\n\n\u23fa ROP-chain: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 fopen(\"/proc/self/mem\") \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u0444\u0430\u0439\u043b, \u0434\u0430\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.\n\u23fa Code Patching: \u0447\u0435\u0440\u0435\u0437 pwrite \u0448\u0435\u043b\u043b\u043a\u043e\u0434 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430. \u042f\u0434\u0440\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 R-X \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.\n\u23fa \u041f\u043e\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.\n\n\ud83d\udcac \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435\n\n#red_team #Android #Pixel #0click #CVE", "creation_timestamp": "2026-08-14T16:00:04.739927Z"}