projectdiscovery/nuclei · error

dialers not initialized for %s

Error message

dialers not initialized for %s

What it means

Returned by mssql.FingerprintMssql when protocolstate.GetDialersWithId(executionId) returns nil, i.e. no dialer set is registered for the current execution ID. Dialers are created when nuclei initializes a template execution; a nil result means the fingerprint code is running outside that lifecycle or with a stale/unknown execution ID.

Source

Thrown at pkg/js/libs/mssql/fingerprint.go:114

}

// @memo
func fingerprintMssql(ctx context.Context, executionId string, host string, port int) (MSSQLInfo, error) {
	info := MSSQLInfo{
		Host:      host,
		Port:      port,
		Protocol:  "mssql",
		Transport: "tcp",
	}
	if host == "" || port <= 0 {
		return info, fmt.Errorf("invalid host or port")
	}
	if !protocolstate.IsHostAllowed(executionId, host) {
		return info, protocolstate.ErrHostDenied.Msgf(host)
	}
	dialer := protocolstate.GetDialersWithId(executionId)
	if dialer == nil {
		return info, fmt.Errorf("dialers not initialized for %s", executionId)
	}

	conn, err := dialer.Fastdialer.Dial(ctx, "tcp", net.JoinHostPort(host, fmt.Sprintf("%d", port)))
	if err != nil {
		return info, err
	}
	defer func() {
		_ = conn.Close()
	}()

	_ = conn.SetDeadline(time.Now().Add(mssqlFingerprintTimeout))
	if _, err := conn.Write(preLoginRequest); err != nil {
		return info, err
	}

	// Read TDS header first, then remaining payload by Length field.
	header := make([]byte, 8)
	if _, err := io.ReadFull(conn, header); err != nil {

View on GitHub (pinned to 265b3a3dec)

Solutions

  1. Run the template through the nuclei engine so dialers are initialized per execution
  2. Upgrade nuclei to the current release (dialer/execution-id wiring has changed across versions)
  3. SDK users: ensure protocolstate initialization happens before template execution
  4. If reproducible on a stock run, file an issue with template and version
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const info = mssql.FingerprintMssql(host, port);
} catch (e) {
  if (String(e).includes('dialers not initialized')) {
    // engine not initialized for this execution: not recoverable from the template
    throw new Error('mssql lib requires a nuclei-initialized runtime');
  }
  throw e;
}

Prevention

When it happens

Trigger: Invoking the mssql lib from a standalone goja runtime or SDK path that never initialized protocolstate dialers; executing after the engine recycled the execution context; version mismatch between the JS libs and the host binary.

Common situations: Embedding nuclei as a library and calling JS libs directly; unit tests exercising fingerprintMssql without engine setup. Not user-fixable from a template — during a normal nuclei run it indicates an engine or integration bug.

Related errors


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/7333e43bb90dfaea. Report an issue: GitHub.