{
  "id": "a653409b-7361-42cb-a009-7e17b9e59c4c",
  "target": "https://typesafe.ai/",
  "scan_date": "2026-09-17T10:44:59.431746+00:00",
  "total_findings": 23,
  "summary": {
    "critical": 0,
    "high": 0,
    "medium": 3,
    "low": 7,
    "info": 13
  },
  "findings": [
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "docs.typesafe.ai",
      "raw": {
        "host": "docs.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "daggerverse.docs.typesafe.ai",
      "raw": {
        "host": "daggerverse.docs.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "evals.typesafe.ai",
      "raw": {
        "host": "evals.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "login.typesafe.ai",
      "raw": {
        "host": "login.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "status.typesafe.ai",
      "raw": {
        "host": "status.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "trust.typesafe.ai",
      "raw": {
        "host": "trust.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (thc)",
      "endpoint": "www.typesafe.ai",
      "raw": {
        "host": "www.typesafe.ai",
        "input": "typesafe.ai",
        "source": "thc"
      }
    },
    {
      "tool": "subfinder",
      "type": "subdomain",
      "severity": "info",
      "title": "Subdomain (hackertarget)",
      "endpoint": "console.typesafe.ai",
      "raw": {
        "host": "console.typesafe.ai",
        "input": "typesafe.ai",
        "source": "hackertarget"
      }
    },
    {
      "tool": "nmap",
      "type": "network",
      "severity": "info",
      "title": "Open tcp/80 (http)",
      "description": "Service http on 31.43.161.6:80/tcp",
      "endpoint": "31.43.161.6:80",
      "raw": {
        "host": "31.43.161.6",
        "port": "80",
        "protocol": "tcp",
        "service": "http",
        "product": "",
        "extrainfo": null
      }
    },
    {
      "tool": "nmap",
      "type": "network",
      "severity": "info",
      "title": "Open tcp/443 (https)",
      "description": "Service https on 31.43.161.6:443/tcp",
      "endpoint": "31.43.161.6:443",
      "raw": {
        "host": "31.43.161.6",
        "port": "443",
        "protocol": "tcp",
        "service": "https",
        "product": "",
        "extrainfo": null
      }
    },
    {
      "tool": "httpx",
      "type": "info",
      "severity": "info",
      "title": "Status 200",
      "endpoint": "https://typesafe.ai/",
      "raw": {
        "timestamp": "2026-09-17T10:31:37.686545894Z",
        "port": "443",
        "url": "https://typesafe.ai/",
        "input": "https://typesafe.ai/",
        "title": "Home - TypeSafe AI",
        "scheme": "https",
        "webserver": "Framer/9cfa469",
        "content_type": "text/html",
        "method": "GET",
        "host": "typesafe.ai",
        "host_ip": "31.43.161.6",
        "path": "/",
        "time": "105.706518ms",
        "a": [
          "31.43.160.6",
          "31.43.161.6"
        ],
        "tech": [
          "Framer Sites",
          "HSTS",
          "HTTP/3",
          "React"
        ],
        "words": 20530,
        "lines": 1393,
        "status_code": 200,
        "content_length": 565555,
        "failed": false,
        "knowledgebase": {
          "pHash": 0
        },
        "resolvers": [
          "1.1.1.1:53",
          "1.0.0.1:53"
        ]
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "medium",
      "title": "Content Security Policy (CSP) Header Not Set",
      "description": "<p>Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware. CSP provides a set of standard HTTP headers that allow website owners to declare approved sources of content that browsers should be allowed to load on that page — covered types are JavaScript, CSS, HTML frames, fonts, images and embeddable objects such as Java applets, ActiveX, audio and video files.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10038",
        "alertRef": "10038-1",
        "alert": "Content Security Policy (CSP) Header Not Set",
        "name": "Content Security Policy (CSP) Header Not Set",
        "riskcode": "2",
        "confidence": "3",
        "riskdesc": "Medium (High)",
        "desc": "<p>Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware. CSP provides a set of standard HTTP headers that allow website owners to declare approved sources of content that browsers should be allowed to load on that page — covered types are JavaScript, CSS, HTML frames, fonts, images and embeddable objects such as Java applets, ActiveX, audio and video files.</p>",
        "instances": [
          {
            "id": "56",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "51",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "76",
            "uri": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "nodeName": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "21",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "69",
            "uri": "https://typesafe.ai/team",
            "nodeName": "https://typesafe.ai/team",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Ensure that your web server, application server, load balancer, etc. is configured to set the Content-Security-Policy header.</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP</p><p>https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html</p><p>https://www.w3.org/TR/CSP/</p><p>https://w3c.github.io/webappsec-csp/</p><p>https://web.dev/articles/csp</p><p>https://caniuse.com/#feat=contentsecuritypolicy</p><p>https://content-security-policy.com/</p>",
        "cweid": "693",
        "wascid": "15",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "medium",
      "title": "Missing Anti-clickjacking Header",
      "description": "<p>The response does not protect against 'ClickJacking' attacks. It should include either Content-Security-Policy with 'frame-ancestors' directive or X-Frame-Options.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10020",
        "alertRef": "10020-1",
        "alert": "Missing Anti-clickjacking Header",
        "name": "Missing Anti-clickjacking Header",
        "riskcode": "2",
        "confidence": "2",
        "riskdesc": "Medium (Medium)",
        "desc": "<p>The response does not protect against 'ClickJacking' attacks. It should include either Content-Security-Policy with 'frame-ancestors' directive or X-Frame-Options.</p>",
        "instances": [
          {
            "id": "43",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "x-frame-options",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "48",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "x-frame-options",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "72",
            "uri": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "nodeName": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "method": "GET",
            "param": "x-frame-options",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "19",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "x-frame-options",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "62",
            "uri": "https://typesafe.ai/team",
            "nodeName": "https://typesafe.ai/team",
            "method": "GET",
            "param": "x-frame-options",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Modern Web browsers support the Content-Security-Policy and X-Frame-Options HTTP headers. Ensure one of them is set on all web pages returned by your site/app.</p><p>If you expect the page to be framed only by pages on your server (e.g. it's part of a FRAMESET) then you'll want to use SAMEORIGIN, otherwise if you never expect the page to be framed, you should use DENY. Alternatively consider implementing Content Security Policy's \"frame-ancestors\" directive.</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options</p>",
        "cweid": "1021",
        "wascid": "15",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "medium",
      "title": "Sub Resource Integrity Attribute Missing",
      "description": "<p>The integrity attribute is missing on a script or link tag served by an external server. The integrity tag prevents an attacker who have gained access to this server from injecting a malicious content.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "90003",
        "alertRef": "90003",
        "alert": "Sub Resource Integrity Attribute Missing",
        "name": "Sub Resource Integrity Attribute Missing",
        "riskcode": "2",
        "confidence": "3",
        "riskdesc": "Medium (High)",
        "desc": "<p>The integrity attribute is missing on a script or link tag served by an external server. The integrity tag prevents an attacker who have gained access to this server from injecting a malicious content.</p>",
        "instances": [
          {
            "id": "34",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "<link rel=\"modulepreload\" fetchpriority=\"low\" href=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/framer.BkQ0YeXs.mjs\">",
            "otherinfo": ""
          },
          {
            "id": "33",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "<link rel=\"modulepreload\" fetchpriority=\"low\" href=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/motion.CLnpqXmG.mjs\">",
            "otherinfo": ""
          },
          {
            "id": "32",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "<link rel=\"modulepreload\" fetchpriority=\"low\" href=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/react.lLtwu6V4.mjs\">",
            "otherinfo": ""
          },
          {
            "id": "31",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "<link rel=\"modulepreload\" fetchpriority=\"low\" href=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/rolldown-runtime.Dh6celcD.mjs\">",
            "otherinfo": ""
          },
          {
            "id": "30",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "<script async src=\"https://events.framer.com/script?v=2\" data-fid=\"f8111b111e9ce8d3e21d0f9765b6ce69c2a2f3f8b0f0744a436382f9f9a8231e\" data-no-nt></script>",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Provide a valid integrity attribute to the tag.</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity</p>",
        "cweid": "345",
        "wascid": "15",
        "sourceid": "19"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Cross-Domain JavaScript Source File Inclusion",
      "description": "<p>The page includes one or more script files from a third-party domain.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10017",
        "alertRef": "10017",
        "alert": "Cross-Domain JavaScript Source File Inclusion",
        "name": "Cross-Domain JavaScript Source File Inclusion",
        "riskcode": "1",
        "confidence": "2",
        "riskdesc": "Low (Medium)",
        "desc": "<p>The page includes one or more script files from a third-party domain.</p>",
        "instances": [
          {
            "id": "57",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "https://events.framer.com/script?v=2",
            "attack": "",
            "evidence": "<script async src=\"https://events.framer.com/script?v=2\" data-fid=\"f8111b111e9ce8d3e21d0f9765b6ce69c2a2f3f8b0f0744a436382f9f9a8231e\" data-no-nt></script>",
            "otherinfo": ""
          },
          {
            "id": "52",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "https://events.framer.com/script?v=2",
            "attack": "",
            "evidence": "<script async src=\"https://events.framer.com/script?v=2\" data-fid=\"f8111b111e9ce8d3e21d0f9765b6ce69c2a2f3f8b0f0744a436382f9f9a8231e\" data-no-nt></script>",
            "otherinfo": ""
          },
          {
            "id": "53",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/script_main.BPX8tBfp.mjs",
            "attack": "",
            "evidence": "<script type=\"module\" async data-framer-bundle=\"main\" fetchPriority=\"low\" src=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/script_main.BPX8tBfp.mjs\"></script>",
            "otherinfo": ""
          },
          {
            "id": "22",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "https://events.framer.com/script?v=2",
            "attack": "",
            "evidence": "<script async src=\"https://events.framer.com/script?v=2\" data-fid=\"f8111b111e9ce8d3e21d0f9765b6ce69c2a2f3f8b0f0744a436382f9f9a8231e\" data-no-nt></script>",
            "otherinfo": ""
          },
          {
            "id": "23",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/script_main.BPX8tBfp.mjs",
            "attack": "",
            "evidence": "<script type=\"module\" async data-framer-bundle=\"main\" fetchPriority=\"low\" src=\"https://framerusercontent.com/sites/43bTeC8cU9jZO20XvdK79t/script_main.BPX8tBfp.mjs\"></script>",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Ensure JavaScript source files are loaded from only trusted sources, and the sources can't be controlled by end users of the application.</p>",
        "otherinfo": "",
        "reference": "",
        "cweid": "829",
        "wascid": "15",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Cross-Origin-Embedder-Policy Header Missing or Invalid",
      "description": "<p>Cross-Origin-Embedder-Policy header is a response header that prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS).</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "90004",
        "alertRef": "90004-2",
        "alert": "Cross-Origin-Embedder-Policy Header Missing or Invalid",
        "name": "Cross-Origin-Embedder-Policy Header Missing or Invalid",
        "riskcode": "1",
        "confidence": "2",
        "riskdesc": "Low (Medium)",
        "desc": "<p>Cross-Origin-Embedder-Policy header is a response header that prevents a document from loading any cross-origin resources that don't explicitly grant the document permission (using CORP or CORS).</p>",
        "instances": [
          {
            "id": "15",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "Cross-Origin-Embedder-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "27",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "Cross-Origin-Embedder-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "7",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "Cross-Origin-Embedder-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "3",
        "systemic": false,
        "solution": "<p>Ensure that the application/web server sets the Cross-Origin-Embedder-Policy header appropriately, and that it sets the Cross-Origin-Embedder-Policy header to 'require-corp' for documents.</p><p>If possible, ensure that the end user uses a standards-compliant and modern web browser that supports the Cross-Origin-Embedder-Policy header (https://caniuse.com/mdn-http_headers_cross-origin-embedder-policy).</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Embedder-Policy</p>",
        "cweid": "693",
        "wascid": "14",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Cross-Origin-Opener-Policy Header Missing or Invalid",
      "description": "<p>Cross-Origin-Opener-Policy header is a response header that allows a site to control if others included documents share the same browsing context. Sharing the same browsing context with untrusted documents might lead to data leak.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "90004",
        "alertRef": "90004-3",
        "alert": "Cross-Origin-Opener-Policy Header Missing or Invalid",
        "name": "Cross-Origin-Opener-Policy Header Missing or Invalid",
        "riskcode": "1",
        "confidence": "2",
        "riskdesc": "Low (Medium)",
        "desc": "<p>Cross-Origin-Opener-Policy header is a response header that allows a site to control if others included documents share the same browsing context. Sharing the same browsing context with untrusted documents might lead to data leak.</p>",
        "instances": [
          {
            "id": "16",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "Cross-Origin-Opener-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "28",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "Cross-Origin-Opener-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "8",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "Cross-Origin-Opener-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "3",
        "systemic": false,
        "solution": "<p>Ensure that the application/web server sets the Cross-Origin-Opener-Policy header appropriately, and that it sets the Cross-Origin-Opener-Policy header to 'same-origin' for documents.</p><p>'same-origin-allow-popups' is considered as less secured and should be avoided.</p><p>If possible, ensure that the end user uses a standards-compliant and modern web browser that supports the Cross-Origin-Opener-Policy header (https://caniuse.com/mdn-http_headers_cross-origin-opener-policy).</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Opener-Policy</p>",
        "cweid": "693",
        "wascid": "14",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Cross-Origin-Resource-Policy Header Missing or Invalid",
      "description": "<p>Cross-Origin-Resource-Policy header is an opt-in header designed to counter side-channels attacks like Spectre. Resource should be specifically set as shareable amongst different origins.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "90004",
        "alertRef": "90004-1",
        "alert": "Cross-Origin-Resource-Policy Header Missing or Invalid",
        "name": "Cross-Origin-Resource-Policy Header Missing or Invalid",
        "riskcode": "1",
        "confidence": "2",
        "riskdesc": "Low (Medium)",
        "desc": "<p>Cross-Origin-Resource-Policy header is an opt-in header designed to counter side-channels attacks like Spectre. Resource should be specifically set as shareable amongst different origins.</p>",
        "instances": [
          {
            "id": "14",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "Cross-Origin-Resource-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "26",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "Cross-Origin-Resource-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "6",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "Cross-Origin-Resource-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "1",
            "uri": "https://typesafe.ai/sitemap.xml",
            "nodeName": "https://typesafe.ai/sitemap.xml",
            "method": "GET",
            "param": "Cross-Origin-Resource-Policy",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "4",
        "systemic": false,
        "solution": "<p>Ensure that the application/web server sets the Cross-Origin-Resource-Policy header appropriately, and that it sets the Cross-Origin-Resource-Policy header to 'same-origin' for all web pages.</p><p>'same-site' is considered as less secured and should be avoided.</p><p>If resources must be shared, set the header to 'cross-origin'.</p><p>If possible, ensure that the end user uses a standards-compliant and modern web browser that supports the Cross-Origin-Resource-Policy header (https://caniuse.com/mdn-http_headers_cross-origin-resource-policy).</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Embedder-Policy</p>",
        "cweid": "693",
        "wascid": "14",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Permissions Policy Header Not Set",
      "description": "<p>Permissions Policy Header is an added layer of security that helps to restrict from unauthorized access or usage of browser/client features by web resources. This policy ensures the user privacy by limiting or specifying the features of the browsers can be used by the web resources. Permissions Policy provides a set of standard HTTP headers that allow website owners to limit which features of browsers can be used by the page such as camera, microphone, location, full screen etc.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10063",
        "alertRef": "10063-1",
        "alert": "Permissions Policy Header Not Set",
        "name": "Permissions Policy Header Not Set",
        "riskcode": "1",
        "confidence": "2",
        "riskdesc": "Low (Medium)",
        "desc": "<p>Permissions Policy Header is an added layer of security that helps to restrict from unauthorized access or usage of browser/client features by web resources. This policy ensures the user privacy by limiting or specifying the features of the browsers can be used by the web resources. Permissions Policy provides a set of standard HTTP headers that allow website owners to limit which features of browsers can be used by the page such as camera, microphone, location, full screen etc.</p>",
        "instances": [
          {
            "id": "11",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "25",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "61",
            "uri": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "nodeName": "https://typesafe.ai/blog/introducing-system-one-models-and-jev",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "5",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          },
          {
            "id": "49",
            "uri": "https://typesafe.ai/team",
            "nodeName": "https://typesafe.ai/team",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Ensure that your web server, application server, load balancer, etc. is configured to set the Permissions-Policy header.</p>",
        "otherinfo": "",
        "reference": "<p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Permissions-Policy</p><p>https://developer.chrome.com/blog/feature-policy/</p><p>https://scotthelme.co.uk/a-new-security-header-feature-policy/</p><p>https://w3c.github.io/webappsec-feature-policy/</p><p>https://www.smashingmagazine.com/2018/12/feature-policy/</p>",
        "cweid": "693",
        "wascid": "15",
        "sourceid": "1"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Server Leaks Version Information via \"Server\" HTTP Response Header Field",
      "description": "<p>The web/application server is leaking version information via the \"Server\" HTTP response header. Access to such information may facilitate attackers identifying other vulnerabilities your web/application server is subject to.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10036",
        "alertRef": "10036-2",
        "alert": "Server Leaks Version Information via \"Server\" HTTP Response Header Field",
        "name": "Server Leaks Version Information via \"Server\" HTTP Response Header Field",
        "riskcode": "1",
        "confidence": "3",
        "riskdesc": "Low (High)",
        "desc": "<p>The web/application server is leaking version information via the \"Server\" HTTP response header. Access to such information may facilitate attackers identifying other vulnerabilities your web/application server is subject to.</p>",
        "instances": [
          {
            "id": "67",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "Framer/9cfa469",
            "otherinfo": ""
          },
          {
            "id": "59",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "Framer/9cfa469",
            "otherinfo": ""
          },
          {
            "id": "29",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "Framer/9cfa469",
            "otherinfo": ""
          },
          {
            "id": "46",
            "uri": "https://typesafe.ai/robots.txt",
            "nodeName": "https://typesafe.ai/robots.txt",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "Framer/9cfa469",
            "otherinfo": ""
          },
          {
            "id": "3",
            "uri": "https://typesafe.ai/sitemap.xml",
            "nodeName": "https://typesafe.ai/sitemap.xml",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "Framer/9cfa469",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>Ensure that your web server, application server, load balancer, etc. is configured to suppress the \"Server\" header or provide generic details.</p>",
        "otherinfo": "",
        "reference": "<p>https://httpd.apache.org/docs/current/mod/core.html#servertokens</p><p>https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff648552(v=pandp.10)</p><p>https://www.troyhunt.com/shhh-dont-let-your-response-headers/</p>",
        "cweid": "497",
        "wascid": "13",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "low",
      "title": "Timestamp Disclosure - Unix",
      "description": "<p>A timestamp was disclosed by the application/web server. - Unix</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10096",
        "alertRef": "10096",
        "alert": "Timestamp Disclosure - Unix",
        "name": "Timestamp Disclosure - Unix",
        "riskcode": "1",
        "confidence": "1",
        "riskdesc": "Low (Low)",
        "desc": "<p>A timestamp was disclosed by the application/web server. - Unix</p>",
        "instances": [
          {
            "id": "93",
            "uri": "https://typesafe.ai/blog/antibenchmaxxing",
            "nodeName": "https://typesafe.ai/blog/antibenchmaxxing",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "1724524111",
            "otherinfo": "1724524111, which evaluates to: 2024-08-24 18:28:31."
          },
          {
            "id": "111",
            "uri": "https://typesafe.ai/legal/mca",
            "nodeName": "https://typesafe.ai/legal/mca",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "1662754362",
            "otherinfo": "1662754362, which evaluates to: 2022-09-09 20:12:42."
          }
        ],
        "count": "2",
        "systemic": false,
        "solution": "<p>Manually confirm that the timestamp data is not sensitive, and that the data cannot be aggregated to disclose exploitable patterns.</p>",
        "otherinfo": "<p>1724524111, which evaluates to: 2024-08-24 18:28:31.</p>",
        "reference": "<p>https://cwe.mitre.org/data/definitions/200.html</p>",
        "cweid": "497",
        "wascid": "13",
        "sourceid": "25"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "informational",
      "title": "Re-examine Cache-control Directives",
      "description": "<p>The cache-control header has not been set properly or is missing, allowing the browser and proxies to cache content. For static assets like css, js, or image files this might be intended, however, the resources should be reviewed to ensure that no sensitive content will be cached.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10015",
        "alertRef": "10015",
        "alert": "Re-examine Cache-control Directives",
        "name": "Re-examine Cache-control Directives",
        "riskcode": "0",
        "confidence": "1",
        "riskdesc": "Informational (Low)",
        "desc": "<p>The cache-control header has not been set properly or is missing, allowing the browser and proxies to cache content. For static assets like css, js, or image files this might be intended, however, the resources should be reviewed to ensure that no sensitive content will be cached.</p>",
        "instances": [
          {
            "id": "55",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "cache-control",
            "attack": "",
            "evidence": "public, max-age=0, must-revalidate",
            "otherinfo": ""
          },
          {
            "id": "50",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "cache-control",
            "attack": "",
            "evidence": "public, max-age=0, must-revalidate",
            "otherinfo": ""
          },
          {
            "id": "20",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "cache-control",
            "attack": "",
            "evidence": "public, max-age=0, must-revalidate",
            "otherinfo": ""
          },
          {
            "id": "45",
            "uri": "https://typesafe.ai/robots.txt",
            "nodeName": "https://typesafe.ai/robots.txt",
            "method": "GET",
            "param": "cache-control",
            "attack": "",
            "evidence": "public, max-age=0, must-revalidate",
            "otherinfo": ""
          },
          {
            "id": "2",
            "uri": "https://typesafe.ai/sitemap.xml",
            "nodeName": "https://typesafe.ai/sitemap.xml",
            "method": "GET",
            "param": "cache-control",
            "attack": "",
            "evidence": "public, max-age=0, must-revalidate",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "<p>For secure content, ensure the cache-control HTTP header is set with \"no-cache, no-store, must-revalidate\". If an asset should be cached consider setting the directives \"public, max-age, immutable\".</p>",
        "otherinfo": "",
        "reference": "<p>https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html#web-content-caching</p><p>https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control</p><p>https://grayduck.mn/2021/09/13/cache-control-recommendations/</p>",
        "cweid": "525",
        "wascid": "13",
        "sourceid": "18"
      }
    },
    {
      "tool": "zap",
      "type": "web",
      "severity": "informational",
      "title": "Storable but Non-Cacheable Content",
      "description": "<p>The response contents are storable by caching components such as proxy servers, but will not be retrieved directly from the cache, without validating the request upstream, in response to similar requests from other users.</p>",
      "endpoint": null,
      "raw": {
        "pluginid": "10049",
        "alertRef": "10049-2",
        "alert": "Storable but Non-Cacheable Content",
        "name": "Storable but Non-Cacheable Content",
        "riskcode": "0",
        "confidence": "2",
        "riskdesc": "Informational (Medium)",
        "desc": "<p>The response contents are storable by caching components such as proxy servers, but will not be retrieved directly from the cache, without validating the request upstream, in response to similar requests from other users.</p>",
        "instances": [
          {
            "id": "9",
            "uri": "https://typesafe.ai/",
            "nodeName": "https://typesafe.ai/",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "max-age=0",
            "otherinfo": ""
          },
          {
            "id": "24",
            "uri": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "nodeName": "https://typesafe.ai/blog/ai-too-good-to-be-true-too-bad-to-be-useful-typesafe-ai",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "max-age=0",
            "otherinfo": ""
          },
          {
            "id": "4",
            "uri": "https://typesafe.ai/manifesto",
            "nodeName": "https://typesafe.ai/manifesto",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "max-age=0",
            "otherinfo": ""
          },
          {
            "id": "44",
            "uri": "https://typesafe.ai/robots.txt",
            "nodeName": "https://typesafe.ai/robots.txt",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "max-age=0",
            "otherinfo": ""
          },
          {
            "id": "0",
            "uri": "https://typesafe.ai/sitemap.xml",
            "nodeName": "https://typesafe.ai/sitemap.xml",
            "method": "GET",
            "param": "",
            "attack": "",
            "evidence": "max-age=0",
            "otherinfo": ""
          }
        ],
        "count": "5",
        "systemic": true,
        "solution": "",
        "otherinfo": "",
        "reference": "<p>https://datatracker.ietf.org/doc/html/rfc7234</p><p>https://datatracker.ietf.org/doc/html/rfc7231</p><p>https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html</p>",
        "cweid": "524",
        "wascid": "13",
        "sourceid": "1"
      }
    }
  ],
  "warnings": [
    "worker_security.py / nuclei: 0 findings after 669s (limit 1200s) — site may block automated scans, need longer SCAN_NUCLEI_TIMEOUT, or no critical/high/medium templates matched"
  ],
  "target_name": "Typesafe"
}