shadow1ng/fscan · error

webscan_poc_file_read_failed

webscan_poc_file_read_failed

Error message

webscan_poc_file_read_failed %s: %w

What it means

LoadPoc reads a POC from an embedded filesystem (embed.FS) at path "pocs/<fileName>" and wraps any ReadFile error under webscan_poc_file_read_failed. It fires when the embedded FS has no such entry, i.e. the file was not compiled into the binary or the name is wrong.

Solutions

  1. Verify the file exists at pocs/<fileName> in the source tree and matches the //go:embed pocs/* pattern
  2. Rebuild the binary after adding new POC files (embed is compile-time)
  3. Pass only the bare filename (e.g. "tomcat.yml"), not "pocs/tomcat.yml" or an absolute path
  4. Use LoadPocbyPath instead if you need to load from the real filesystem

Example fix

// before (full path passed to embedded FS loader)
poc, err := LoadPoc("pocs/tomcat.yml", pocsFS)
// after (bare filename)
poc, err := LoadPoc("tomcat.yml", pocsFS)
// or for on-disk files:
poc, err := LoadPocbyPath("/path/to/tomcat.yml")
Defensive patterns

Strategy: fallback

Validate before calling

if _, err := pocsFS.ReadFile("pocs/" + fileName); err != nil {
    return fmt.Errorf("poc %q not embedded: %w", fileName, err)
}

Try / catch

poc, err := LoadPoc(name, pocsFS)
if err != nil {
    if _, statErr := os.Stat(filepath.Join("pocs", name)); statErr == nil {
        poc, err = LoadPocbyPath(filepath.Join("pocs", name))
    }
}

Prevention

When it happens

Trigger: LoadPoc(fileName, Pocs) where "pocs/"+fileName does not exist in the embed.FS — wrong filename, missing pocs/ prefix handling, or the POC file was added to disk but the binary wasn't rebuilt after the embed.

Common situations: Typo in POC filename or case mismatch, loading a POC that exists on disk but is not embedded (embed only includes files matching the //go:embed pattern at build time), calling LoadPoc with a full path instead of a bare filename.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of shadow1ng/fscan@95cc12e753 (2026-09-06). Data as JSON: /api/errors/09e996702868cfce. Report an issue: GitHub.

Appendix: source

Thrown at webscan/lib/Client.go:438

	if err != nil {
		return nil, fmt.Errorf("%s %s: %w", i18n.GetText("webscan_poc_parse_failed"), fileName, err)
	}

	// 转换为fscan内部格式
	poc, err := universalPoc.ToFscanPoc()
	if err != nil {
		return nil, fmt.Errorf("%s %s: %w", i18n.GetText("webscan_poc_convert_failed"), fileName, err)
	}

	return poc, nil
}

// LoadPoc 从内嵌文件系统加载单个POC
func LoadPoc(fileName string, Pocs embed.FS) (*Poc, error) {
	// 读取POC文件内容
	yamlFile, err := Pocs.ReadFile("pocs/" + fileName)
	if err != nil {
		return nil, fmt.Errorf("%s %s: %w", i18n.GetText("webscan_poc_file_read_failed"), fileName, err)
	}

	// 解析YAML内容
	return parsePocYAML(yamlFile, fileName)
}

// SelectPoc 根据名称关键字选择POC文件
func SelectPoc(Pocs embed.FS, pocname string) []string {
	entries, err := Pocs.ReadDir("pocs")
	if err != nil {
		common.LogError(i18n.Tr("webscan_poc_dir_read_failed", err))
	}

	var foundFiles []string
	// 查找匹配关键字的POC文件
	for _, entry := range entries {
		if strings.Contains(entry.Name(), pocname) {
			foundFiles = append(foundFiles, entry.Name())

View on GitHub (pinned to 95cc12e753)