backend-inferencer

SKILL.md

Backend Inferencer Skill

Purpose

Infer backend technologies by analyzing HTTP headers, cookies, error pages, DNS records, and repository data.

Input

Raw signals from Phase 2:

  • http_signals - Server headers, X-Powered-By, cookies
  • dns_signals - Service verification TXT records
  • repository_signals - Dependencies, Dockerfiles
  • html_signals - Generator meta tags, CMS patterns

Technology Categories

Web Servers

Technology Detection Signals Weight
nginx Server: nginx, nginx error pages 35-40
Apache Server: Apache, Apache error pages 35-40
Microsoft IIS Server: Microsoft-IIS 40
Caddy Server: Caddy 35
LiteSpeed Server: LiteSpeed 35

Programming Languages

Technology Detection Signals Weight
Node.js X-Powered-By: Express, connect.sid cookie 30-40
Python X-Powered-By: gunicorn/Werkzeug, django_session cookie 30-40
PHP X-Powered-By: PHP, PHPSESSID cookie 35-40
Ruby _rails_session cookie, X-Request-Id 30-40
Java JSESSIONID cookie, X-Powered-By: Servlet 35-40
Go Custom patterns, repo analysis 25-35
.NET ASP.NET_SessionId cookie, X-AspNet-Version 40

Backend Frameworks

Technology Detection Signals Implies Weight
Express.js X-Powered-By: Express Node.js 40
NestJS Nest patterns, repo analysis Node.js, TypeScript 35
Fastify Fastify patterns Node.js 35
Django csrftoken/django_session cookies Python 40
Flask Werkzeug server Python 35
FastAPI uvicorn patterns Python 35
Rails _rails_session cookie Ruby 40
Laravel laravel_session cookie, XSRF-TOKEN PHP 40
Symfony symfony cookie patterns PHP 35
Spring JSESSIONID, X-Application-Context Java 35
ASP.NET ASP.NET_SessionId .NET 40

Content Management Systems

Technology Detection Signals Weight
WordPress /wp-content/, /wp-admin/, generator meta 45
Drupal X-Drupal-Cache, /sites/default/ 45
Joomla generator meta, /components/ 40
Magento /skin/frontend/, Mage patterns 40
Shopify myshopify.com, Shopify patterns 45
Contentful Contentful API patterns 35
Strapi Strapi patterns 35
Ghost Ghost generator meta 40

Databases (Indirect Signals)

Technology Detection Signals Weight
PostgreSQL pg dependency, Heroku Postgres 25-30
MySQL mysql dependency, common patterns 25-30
MongoDB mongoose dependency, MongoDB Atlas TXT 30
Redis redis dependency, session patterns 25-30
Elasticsearch elasticsearch dependency 25-30
DynamoDB AWS SDK patterns, boto3 25-30

API Technologies

Technology Detection Signals Weight
GraphQL /graphql endpoint, schema patterns 35
REST /api/v1, OpenAPI spec 25
gRPC grpc patterns in repos 30
tRPC tRPC patterns 30

Inference Logic

def infer_backend_technologies(signals):
    results = []

    # Web Server Detection
    server_header = signals.http_signals.get('Server', '')
    for server in SERVER_PATTERNS:
        if server.pattern.match(server_header):
            results.append({
                "name": server.name,
                "category": "Web Server",
                "version": extract_version(server_header, server.pattern),
                "signals": [{"type": "http_header", "value": f"Server: {server_header}"}],
                "total_weight": server.weight
            })

    # Language/Framework from X-Powered-By
    powered_by = signals.http_signals.get('X-Powered-By', '')
    for framework in POWERED_BY_PATTERNS:
        if framework.pattern in powered_by:
            results.append({
                "name": framework.name,
                "category": framework.category,
                "implies": framework.implies,
                "signals": [{"type": "http_header", "value": f"X-Powered-By: {powered_by}"}],
                "total_weight": framework.weight
            })

    # Cookie-based Detection
    for cookie in signals.http_signals.cookies:
        for pattern in COOKIE_PATTERNS:
            if pattern.name in cookie:
                results.append({
                    "name": pattern.tech,
                    "category": pattern.category,
                    "implies": pattern.implies,
                    "signals": [{"type": "cookie", "value": f"Cookie: {cookie}"}],
                    "total_weight": pattern.weight
                })

    # CMS Detection from HTML
    for cms in CMS_PATTERNS:
        score = 0
        evidence = []

        if cms.generator_pattern in signals.html_signals.generators:
            score += 40
            evidence.append("Generator meta tag")

        for url_pattern in cms.url_patterns:
            if url_pattern in signals.html_signals.script_urls:
                score += 20
                evidence.append(f"URL pattern: {url_pattern}")

        if score > 0:
            results.append({
                "name": cms.name,
                "category": "CMS",
                "signals": evidence,
                "total_weight": score
            })

    # Repository-based Detection
    if signals.repository_signals:
        for dep_file, deps in signals.repository_signals.dependencies.items():
            for dep in deps:
                if dep.name in DEPENDENCY_PATTERNS:
                    pattern = DEPENDENCY_PATTERNS[dep.name]
                    results.append({
                        "name": pattern.tech,
                        "category": pattern.category,
                        "version": dep.version,
                        "signals": [{"type": "dependency", "value": f"{dep.name}@{dep.version}"}],
                        "total_weight": pattern.weight
                    })

    return results

Output

{
  "skill": "backend_inferencer",
  "results": {
    "technologies": [
      {
        "name": "nginx",
        "category": "Web Server",
        "version": "1.18.0",
        "signals": [
          {
            "type": "http_header",
            "value": "Server: nginx/1.18.0",
            "source": "https://example.com",
            "weight": 40
          }
        ],
        "total_weight": 40
      },
      {
        "name": "Express.js",
        "category": "Backend Framework",
        "signals": [
          {
            "type": "http_header",
            "value": "X-Powered-By: Express",
            "source": "https://api.example.com",
            "weight": 40
          },
          {
            "type": "cookie",
            "value": "connect.sid session cookie",
            "source": "https://example.com",
            "weight": 30
          }
        ],
        "total_weight": 70,
        "implies": ["Node.js"]
      },
      {
        "name": "Node.js",
        "category": "Runtime",
        "signals": [
          {
            "type": "implied",
            "value": "Implied by Express.js detection",
            "weight": 0
          },
          {
            "type": "dependency",
            "value": "node version in package.json",
            "source": "github.com/example/repo",
            "weight": 35
          }
        ],
        "total_weight": 35
      },
      {
        "name": "PostgreSQL",
        "category": "Database",
        "signals": [
          {
            "type": "dependency",
            "value": "pg@8.11.0 in package.json",
            "source": "github.com/example/repo",
            "weight": 30
          }
        ],
        "total_weight": 30
      }
    ],
    "implied_technologies": [
      {
        "name": "Node.js",
        "implied_by": ["Express.js"],
        "confidence": "High"
      }
    ],
    "summary": {
      "web_server": "nginx",
      "runtime": "Node.js",
      "framework": "Express.js",
      "database": "PostgreSQL",
      "cms": null
    }
  }
}

Version Detection

From Headers

Server: nginx/1.18.0 → nginx 1.18.0
X-Powered-By: PHP/8.1.0 → PHP 8.1.0
X-AspNet-Version: 4.0.30319 → ASP.NET 4.x

From Dependencies

// package.json
"express": "^4.18.2" → Express.js 4.18.x

// requirements.txt
Django==4.2.1 → Django 4.2.1

// Gemfile
gem 'rails', '~> 7.0' → Rails 7.0.x

Error Handling

  • Missing headers: Continue with other signals
  • Ambiguous cookies: Include all possibilities
  • Conflicting signals: Report both, flag for correlation phase
Weekly Installs
4
GitHub Stars
67
First Seen
7 days ago
Installed on
opencode4
claude-code4
github-copilot4
codex4
amp4
cline4