Views
No views yet
H5LambdaDetectScan scanner only checks top-level layers in the H5 model config for class_name == "Lambda". Lambda layers nested inside sub-models or wrapper layers are not detected.modelscan/scanners/h5/scan.py lines 105-130:1def _get_keras_h5_operator_names(self, model: Model) -> Optional[List[Any]]:
2 with h5py.File(model.get_stream()) as model_hdf5:
3 model_config = json.loads(model_hdf5.attrs.get("model_config", {}))
4 layers = model_config.get("config", {}).get("layers", {})
5 lambda_layers = []
6 for layer in layers:
7 if layer.get("class_name", {}) == "Lambda": # Only top-level!
8 lambda_layers.append(...)model_config["config"]["layers"] at the top level only. It does not:layer field inside wrapper layers (TimeDistributed, Bidirectional)nested_model_h5_bypass.h5)Functional sub-model:[Dense, Functional] -> No Lambda detectedFunctional.config.layers contains [InputLayer, Lambda]wrapper_layer_h5_bypass.h5)TimeDistributed layer:[Dense, TimeDistributed] -> No Lambda detectedTimeDistributed.config.layer is a Lambdatf.keras.models.load_model('model.h5', safe_mode=False):load_model() reads model_config from HDF5 attributemodel_from_config() processes layers recursivelyFunctional.from_config() calls process_layer() for each nested layerLambda.from_config() calls python_utils.func_load()func_load() does: base64.decode() -> marshal.loads() -> types.FunctionType() -> ACE$ modelscan -p nested_model_h5_bypass.h5
No issues found!
$ modelscan -p wrapper_layer_h5_bypass.h5
No issues found!
$ modelscan -p normal_lambda.h5 # (top-level Lambda for comparison)
Total Issues: 1 (MEDIUM: Use of unsafe operator 'Lambda').h5 model file that: