google/tsunami-security-scanner · error · LookupError

No payload implemented for

Error message

No payload implemented for %s vulnerability type, %s interpretation environment, and %s execution environment.

What it means

PayloadGenerator.generate/generate_no_callback look up a payload matching the config's vulnerability type plus interpretation/execution environments. When the pre-loaded payload table has no match even without callback, LookupError is raised because the generator cannot fabricate a payload for that combination.

Solutions

  1. Check the error message's three interpolated values and compare against the payload definitions actually loaded
  2. Add a payload definition covering that vulnerability type + environments (in the payload proto/text resources)
  3. Verify the payload files are being loaded and validated (payload_utility.get_parsed_payload) before generation
  4. Fall back to a supported environment combination or catch LookupError and skip the vulnerability test

Example fix

// before
payload = generator.generate(config)
// after
try:
  payload = generator.generate(config)
except LookupError:
  logging.warning('No payload for %s; skipping', config.vulnerability_type)
  return None
Defensive patterns

Strategy: try-catch

Validate before calling

def has_payload(generator, config):
    return (generator._find_matching_payload(config, True) is not None or
            generator._find_matching_payload(config, False) is not None)

Try / catch

try:
    payload = generator.generate(config)
except LookupError as e:
    logging.warning('Unsupported payload combination: %s', e)
    payload = None

Prevention

When it happens

Trigger: Calling generate(config) with a VulnerabilityType / InterpretationEnvironment / ExecutionEnvironment combination that has no payload definition registered, or with use_callback=True when callback server handling yields no match and no fallback exists.

Common situations: Custom or recently added vulnerability types without corresponding payload definitions; payload files not loaded (wrong path/package); enum value typo mapping to an unsupported environment combination; plugin SDK version mismatch leaving new payload types undefined.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of google/tsunami-security-scanner@363ba87b35 (2026-09-13). Data as JSON: /api/errors/9faf83ec6302998c. Report an issue: GitHub.

Appendix: source

Thrown at plugin_server/py/plugin/payload/payload_generator.py:83

      config: Payload generator config detailing the attributes required for the
        selected payload.

    Returns:
      A matching payload per the payload generator config.
    """
    return self._generate_payload(config, False)

  def _generate_payload(
      self, config: pg.PayloadGeneratorConfig, use_callback: bool
  ) -> Payload:
    """Find matching payload per the provided attributes."""
    payload = None
    if self.tcs_client.is_callback_server_enabled() and use_callback:
      payload = self._find_matching_payload(config, use_callback)
    if not payload:
      payload = self._find_matching_payload(config, False)
    if not payload:
      raise LookupError(
          'No payload implemented for %s vulnerability type, %s interpretation'
          ' environment, and %s execution environment.'
          % (
              pg.PayloadGeneratorConfig.VulnerabilityType.Name(
                  config.vulnerability_type
              ),
              pg.PayloadGeneratorConfig.InterpretationEnvironment.Name(
                  config.interpretation_environment
              ),
              pg.PayloadGeneratorConfig.ExecutionEnvironment.Name(
                  config.execution_environment
              ),
          )
      )
    return payload

  def _find_matching_payload(
      self, config: pg.PayloadGeneratorConfig, use_callback: bool

View on GitHub (pinned to 363ba87b35)