{"record":{"id":"ddab62de1ab1d889","repo":"google/tsunami-security-scanner","slug":"parse-payload-does-not-have-an-interpretation-environment","errorCode":null,"errorMessage":"Parse payload does not have an interpretation environment.","messagePattern":"Parse payload does not have an interpretation environment\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"plugin_server/py/plugin/payload/payload_utility.py","lineNumber":58,"sourceCode":"  payload_str = Path(_PATH).read_text()\n  yaml_parser = yaml.YAML(typ='safe', pure=True)\n  payload_dict = yaml_parser.load(payload_str)\n  payload_library = json_format.ParseDict(payload_dict, pg.PayloadLibrary())\n  return _validate_payloads([p for p in payload_library.payloads])\n\n\ndef _validate_payloads(\n    payloads: list[pg.PayloadDefinition],\n) -> list[pg.PayloadDefinition]:\n  \"\"\"Validate the pre-loaded payloads.\"\"\"\n  for payload in payloads:\n    if not payload.HasField('name'):\n      raise ValueError('Parse payload does not have a name.')\n    if (\n        payload.interpretation_environment\n        is pg.PayloadGeneratorConfig.InterpretationEnvironment.INTERPRETATION_ENVIRONMENT_UNSPECIFIED\n    ):\n      raise ValueError(\n          'Parse payload does not have an interpretation environment.'\n      )\n    if (\n        payload.execution_environment\n        is pg.PayloadGeneratorConfig.ExecutionEnvironment.EXECUTION_ENVIRONMENT_UNSPECIFIED\n    ):\n      raise ValueError('Parse payload does not have an execution environment.')\n    if (\n        pg.PayloadGeneratorConfig.VulnerabilityType.VULNERABILITY_TYPE_UNSPECIFIED\n        in payload.vulnerability_type\n    ):\n      raise ValueError('Parse payload does not have a vulnerability type.')\n    if not payload.HasField('payload_string'):\n      raise ValueError('Parse payload does not have a payload string.')\n    if bool(\n        payload.uses_callback_server.ByteSize()\n    ) and '$TSUNAMI_PAYLOAD_TOKEN_URL' not in str(payload.payload_string):\n      raise ValueError(","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/google/tsunami-security-scanner/blob/363ba87b3543f8ae8e4304d3416818f03da7f262/plugin_server/py/plugin/payload/payload_utility.py#L40-L76","documentation":"The same validator also requires each PayloadDefinition to specify an interpretation environment. If it is left as INTERPRETATION_ENVIRONMENT_UNSPECIFIED, ValueError is raised because payload selection and generation depend on knowing how the payload will be interpreted (e.g. exec vs HTML vs JavaScript).","triggerScenarios":"get_parsed_payload receives a payload whose interpretation_environment field is unset/unspecified — a payload resource entry missing the field or a programmatically built PayloadDefinition that never set it.","commonSituations":"New payload definitions authored without choosing an interpretation environment; copying an existing payload and dropping enum lines; proto/enum renames leaving the field at its default value.","solutions":["Set interpretation_environment to a concrete enum value (e.g. INTERPRETATION_ENVIRONMENT_EXEC, ..._HTML, ..._JAVASCRIPT) in the payload definition","Check the payload resource file for a missing/misspelled interpretation_environment line","When building payloads in code, always set both interpretation_environment and execution_environment","Run a load/validate test over all payload resources to catch unspecified fields early"],"exampleFix":"// before\n# payload definition missing environment lines\nexecution_environment: EXECUTION_ENVIRONMENT_UNIX_SHELL\n// after\ninterpretation_environment: INTERPRETATION_ENVIRONMENT_EXEC\nexecution_environment: EXECUTION_ENVIRONMENT_UNIX_SHELL","handlingStrategy":"validation","validationCode":"def validate_environments(payloads):\n    for p in payloads:\n        if p.interpretation_environment == pg.PayloadGeneratorConfig.InterpretationEnvironment.INTERPRETATION_ENVIRONMENT_UNSPECIFIED:\n            raise ValueError(f'payload {p.name} missing interpretation environment')\n    return payloads","typeGuard":null,"tryCatchPattern":"try:\n    payloads = payload_utility.get_parsed_payload(raw_payloads)\nexcept ValueError as e:\n    logging.error('Invalid payload environment: %s', e)\n    payloads = []","preventionTips":["Set both interpretation_environment and execution_environment on every new payload","Template new payload definitions from a complete existing one","Validate payload resources in CI so unspecified enum fields fail before deployment"],"tags":["python","payload","protobuf","schema-validation","enum"],"backgroundTag":"missing-required-config-field","analyzedSha":"363ba87b3543f8ae8e4304d3416818f03da7f262","analyzedAt":"2026-09-13T01:50:53.990Z","contentChangedAt":"2026-09-13T01:50:53.990Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}