Vulnerability Research
Finding Critical Infrastructure Bugs with Off-the-Shelf AI
From 9 Months to 90 Hours: Smashing TCP/IP Stacks
Key Findings
- We tested whether security researchers and attackers could find vulnerabilities in critical-infrastructure-relevant, open-source targets and binaries using generally available AI models on a limited budget.
- We developed a specialized AI harness for vulnerability research in embedded software and ran it against 10 popular TCP/IP stacks: seven we had previously analyzed and three we had not. Our AI harness found:
- 99 vulnerabilities in 90 hours.
- 66 are new vulnerabilities: 54 of them were reported to the vendors and maintainers.
- 52% of the vulnerabilities are critical or high severity.
- 29% of the vulnerabilities affect core components of the TCP/IP stacks instead of application level or other protocols.
- Past disclosures suggest these supply-chain flaws likely affect hundreds of products from dozens of vendors. However, stack vendors’ patches must still reach affected devices through the supply chain.
- AI cut the analysis time from 9 months to 90 hours and the research cost by 100x when compared to our previous analysis:
- It rediscovered 40% of the vulnerabilities we had previously disclosed on those stacks.
- Total static analysis cost was $935, an average of $2.58 per finding.
- Static analysis of binary targets was on average six times more expensive and took twice as long than source code
Mitigation Recommendations
- For asset owners and end users:
- Assess and prioritize risk based on reachability, exploitability, and operational impact.
- Reduce unnecessary exposure of devices by restricting services, such as FTP, Telnet, IPv6, and web administration interfaces.
- Isolate devices that cannot be patched, allowing only strictly required traffic.
- Shorten the time to patch when fixes exist by accelerating patching processes to keep up with a faster rate of disclosures.
- For software vendors and maintainers:
- Use AI to find bugs before attackers do.
- Expect more AI-generated vulnerability reports and to handle those.
1. Executive Summary
News about AI models finding thousands of vulnerabilities are now commonplace. One of the biggest examples of AI-discovered vulnerabilities this year was PHP2Shell, which made many security teams hurry to patch vulnerable websites comprising large chunks of the internet.
Most of these findings are based on access to three items that are not always available to attackers or to some defenders:
- Cooperative frontier models, such as the latest models from OpenAI or Anthropic without guardrails refusing to perform certain tasks. Since access to these models and guardrail levels are controlled by the AI labs, attackers cannot count on using the latest and greatest, while defenders need to be approved first.
- A sizeable budget to run those models. The costs of AI analysis to find security vulnerabilities can quickly escalate out of the reach of what many cybercriminals would be willing to pay. Defenders do not have unlimited security budgets. At the same time, attackers are usually not interested in finding every possible security weakness on a target but rather finding at least one that is exploitable – possibly with the lowest reasonable cost.
- The source code of targets. AI-assisted vulnerability research works very well on source code, but this is not always available for attackers, especially if they would target embedded equipment, such as network edge devices or those used in critical infrastructure. As we showed previously, exploiting low-level embedded software without having source code is still more difficult for AI.
So, in this research, we set out to answer whether security researchers – and attackers alike – could use generally available models with a limited budget to find vulnerabilities both in open-source targets and binaries that are relevant to critical infrastructure.
To do so, we built our own AI harness specialized for embedded software – including reverse engineering, security analysis and dynamic emulation – and found 66 new vulnerabilities affecting software we had analyzed in the past as part of Project Memoria and some new similar ones. Fifty-four (54) of these findings were reported to vendors and project maintainers: 20 affecting open-source TCP/IP stacks , and 34 affecting proprietary stacks (only five have been fixed to date).
Project Memoria was large-scale vulnerability research against embedded TCP/IP stacks – the foundational software components connecting every device to a network. That project started in 2020, took 18 months and uncovered almost 100 CVEs in 14 stacks used by embedded devices of dozens of vendors. At that time, vulnerability research was largely a manual task performed by seasoned security researchers, sometimes with the help of static analysis or fuzzing tools.
Now, we repeated the project using the new capabilities provided by AI and compared the results with the manual effort of six years ago. These results are summarized in the table below.
| Dimension | Project Memoria (2020-2021) | This study (2026) |
|---|---|---|
| Approach | Manual analysis, assisted by traditional tools. | AI harness, supervised by researchers. |
| Stacks analyzed | 14 across five phases. | 10 in a single phase. |
| Vulnerabilities | 71 across the stacks re-analyzed here. | 99 in total: 33 rediscovered and 66 new. |
| Time | 18 months total.
~9 months of code analysis. |
10 hours of independent AI analysis.
~80 hours for dynamic validation. |
| Cost | Researcher time (~9 months). | $935 static analysis with AI
$290–$1,380 estimated for dynamic analysis. |
It’s easy to see the speed difference: AI cut the analysis time from 9 months to 90 hours. But the cost difference is even more striking: the $1,200 to $2,300 of model spend for this study is likely 100x less than the cost of a senior vulnerability researcher working on manual code analysis.
This comparison does not include the effort to design the AI harness, develop, and refine static analysis rules, build the emulation infrastructure, and refine prompts until the agents behaved consistently. The reported cost is the marginal cost of applying the completed harness to new targets.
This means that once someone has access to a system that can find this type of vulnerability – whether it’s a frontier model or a harness developed for that purpose – they can do so quickly and cheaply. That goes for both attackers and defenders, and it has several implications for device manufacturers and asset owners alike, which we explore at the end of this report. But the main lesson from the study is summarized below.
This research uncovered 99 vulnerabilities in 90 hours including automated analysis and human validation. As model capability improves, both the time and human effort required are likely to fall. Defensive operations that depend on human approval for every action may struggle to keep pace if offensive systems become able to run similar workflows across many targets in parallel.
Forescout’s Assume Autonomy framework addresses this directly: organizations should define now, before the threat matures, which defensive responses they are prepared to delegate, under what operational constraints, and with what ability to reverse automated actions. The challenge is not simply whether to trust autonomous defense, but how to make that trust constrained, observable, and verifiable.
2. Methodology
2.1. Why We Built a Harness
In the past year, the cybersecurity community developed several open AI security harnesses that combine LLM agents, traditional tools, specialized prompts, and reusable skills for vulnerability discovery.
We first tried to apply these existing harnesses to our TCP/IP stack targets, but that yielded few meaningful results, since these harnesses had three limitations:
- Some are fully AI-driven rather than AI-assisted. While it’s tempting to let an AI agent decide what to do and which tools to use autonomously, that can quickly escalate costs and lead to entirely non-deterministic results or dead ends. We needed more control over the analysis. Static analysis tools produce deterministic findings but are usually tuned to flag most mistakes as potential vulnerabilities, making them prone to false positive findings. This is exactly where AI can help, by reasoning over the initial findings of static analysis. Harnesses like RAPTOR, OpenAnt, VVAH, ai-deep-sast, and deepsec use static analysis to discover an initial set of candidate vulnerabilities via third-party tools, simple regular expressions, or their own lightweight data- and control-flow analysis.
- Most only support scanning source code. To analyze embedded software, we need to examine binary artifacts. Several of the open harnesses do not support that, in some cases even focusing on source code analysis only for web applications. Supporting binary analysis is challenging for several reasons:
- It may be impossible to break down monolithic firmware images into individual binaries or functional components, thus increasing the search space.
- Binaries are often stripped of function and variable names, making it much harder to find relevant functionality and reason about its implementation.
- Binaries for different CPU architectures produce different disassembly code. Static analysis rules that work against source code or one architecture may not be suitable for another one. We need an intermediate representation to support both source code and binary analysis.
- Most lack dynamic analysis. Only RAPTOR, Defending Code Harness, and OpenAnt support dynamic analysis to generate proof-of-concept exploits and eliminate false positives. However, dynamic analysis for binary targets is also much more difficult since the harness needs to run on a virtual machine a software image designed for embedded hardware. This means that CPU support and third-party drivers may be missing.
Therefore, we decided to build a harness suitable for our research domains – embedded devices, firmware, and network protocols – encoding the knowledge accumulated over years of research within these domains.
2.2. Building the Harness
Inspired by RAPTOR, OpenAnt, and Defending Code Harness, we built the harness depicted and described below, mixing deterministic and AI-driven steps.
Stage 0: AI-driven target examination
An AI agent examines binary targets to prepare them for analysis. The agent performs several preparatory actions:
- Determines the kind of artifact being analyzed, such as firmware with filesystem and individual binaries or monolithic binary blobs.
- Collects architecture markers, pointer patterns, entropy, and strings to identify the target architecture, endianness, and load address.
- For stripped code – binaries without debug symbols – it identifies the boundaries of the functionality we wish to analyze (such as TCP/IP stacks) and generates function and variable names using various common heuristics, such as analyzing the original names of functions logged when an assertion is hit.
- Identifies libc functions or equivalents such as memcpy(), memmove(), malloc(), and string handling functions.
- Uses Ghidra to convert binaries to a common intermediate representation understood by the different static analysis tools.
Stage 1: deterministic vulnerability discovery
Deterministic static analysis tools find specific categories of vulnerabilities, which enables stable coverage and makes the process measurable and repeatable. We used Semgrep for lightweight source code analysis and Joern for more complex data- and control-flow analyses. Joern uses a code property graph (CPG) as its own intermediate representation and supports translating bytecode disassembly produced by Ghidra into a CPG. This enables us to use the same static analysis ruleset for source code and binaries.
Stage 2: reachability analysis
Multiple agents examine groups of findings to statically determine whether the potential vulnerable code fragments can be reached with attacker input. This stage enables initial pruning of false positives, while the remaining findings undergo a deeper – and more expensive – AI reasoning.
Stage 3: vulnerability checker
AI agents statically determine whether the remaining findings are exploitable vulnerabilities. Using static analysis rules that favor recall combined with AI-driven reasoning significantly increases the precision of the static analysis, while keeping the LLM-related costs relatively low.
Stage 4: dynamic verification
While the previous stages are fully automated, this stage is implemented as skills that allow the researcher to intervene and guide the dynamic analysis as needed. Here, AI determines how to build (or emulate) the target software or firmware and then runs it. After the target is live, for each potential finding, an AI agent attempts to generate a proof-of-concept script that triggers the statically found vulnerability. If the issue can be triggered, a vulnerability is confirmed and a report is generated. Otherwise, it is discarded. This stage can also find new vulnerabilities, not present initially among the results of the static analysis.
2.3. AI Models and Static Analysis Rules
With the architecture of the harness in place, we had to work on two main components to make it functional: AI models and a set of static analysis rules.
For the AI models, we used the Claude family due to their superior performance in our earlier evaluations and its not-too-restrictive guardrails. For the first three stages, we used faster and cheaper models, such as Sonnet 4.6 with high and max reasoning. For dynamic verification, we used Opus versions between 4.6 and 5 because of their extended reasoning and exploitation capabilities. When using older models, we rarely faced the guardrail restrictions we saw on more recent ones.
For static analysis, we implemented 32 Joern rules to identify memory corruption and protocol parsing issues commonly found in embedded TCP/IP stacks. The rules were designed based on implementation anti-patterns that we previously identified in Project Memoria, such as RFC violations, inconsistent message parsing, unsafe handling of protocol fields, and subtle logical errors. The implemented rules are the following:
| Category | Rules | Description |
|---|---|---|
| Buffer overflow | 7 | Similar to common C/C++ buffer overflows, with additional context about “network-tainted” sources and sinks such as recv(), recvfrom(), read(), htons(), and ntohs(). |
| DNS RR processing | 5 | Common anti-patterns of DNS RR processing, outlined in RFC 9267. |
| ICMPv6 extension header parsing | 2 | Issues related to parsing ICMP extension headers in ICMPv6. |
| Hit abort/assert | 1 | Issues related to hitting assert/abort functions in production code, which leads to denial of service. |
| Integer overflow | 9 | Unexpected/faulty behavior related to integer overflow, such as infinite loops, logical errors, and parsing type-length-value (TLV) entries prevalent in networking protocols. |
| NULL pointer dereference | 1 | Issues related to accessing uninitialized pointers. |
| Memory safety / Protocol parsing | 5 | Networking protocol parsing issues resulting in faulty loop conditions and/or out-of-bounds memory writes and reads. |
| Uninitialized memory/weak randomness | 2 | Use of uninitialized memory and weak randomness, such as predictable TCP initial sequence numbers (ISNs). |
These rules were implemented with the help of AI. We gave Claude all artifacts produced during our earlier research – including vulnerability reports, proof-of-concept exploits, static analysis rules, protocol specifications, and technical write-ups – and asked it to generate rules that were then manually reviewed. The generated rules are implementation-agnostic, using standard integer types and CPG operators, rather than vendor function names. This process required several iterations. Indeed, a robust rule set is paramount to obtaining reliable results because the first stage is the main bottleneck in this harness: a missing or ineffective rule could result in false negatives.
3. Main Findings
We selected ten TCP/IP stack targets to run our harness against: seven from Project Memoria and a separate similar study from other researchers – a collection we call ‘Project Memoria+’ – and three new stacks.
The table below details these stacks and analyzed versions. The vulnerable versions of open-source implementations were readily available. To obtain closed-source implementations we downloaded suitable third-party firmware or demo binaries. The responsible disclosure process is still ongoing for three stacks, so we call them S1, S2, and S3 in the table and the remainder of this report.
| Group | Stack | Vulnerabilities from Project Memoria | Open Source? |
|---|---|---|---|
| Project Memoria+ | Contiki v3.0 | 14 | Yes |
| Ethernut v5.1 | 5 | Yes | |
| FNET v4.6.3 | 6 | Yes | |
| PicoTCP v1.7.0 | 11 | Yes | |
| S1 | 12 | No | |
| S2 | 14 | No | |
| Nucleus NET v5.1 |
20 | No | |
| New stacks | lwIP v2.2.1 | 0 | Yes |
| wolfIP v.1.0 | 0 | Yes | |
| S3 | 0 | No |
Across these stacks, we evaluated the following success criteria:
- The harness can find the vulnerabilities we previously found manually.
- The harness can find new vulnerabilities, including variants of the previous ones.
- The harness is cost-effective, ensuring we do not spend an unrealistic number of tokens (and money).
3.1. Old and New Vulnerabilities
Out of the 82 vulnerabilities in Project Memoria+, the harness rediscovered 33 (40%). It also found 66 new vulnerabilities either missed in the original analysis or affecting the previously unanalyzed stacks. The figure below shows the distribution of all 99 bugs discovered by the harness per category.
This shows how the harness is good at finding memory safety bugs in protocol parsing code but misses logic and design bugs, such as Initial Sequence Number (ISN) predictability, bad Pseudo-Random Number Generation (PRNG), DNS cache poisoning, and TCP state machine issues. This is expected because we used static analysis rules focused on generic code patterns rather than specific implementations. Memory safety issues are more amenable to these static analysis rules, while logic bugs are implementation-specific and much harder to capture with a reasonable tradeoff between false positives and false negatives. The logic bugs that were found were byproducts of the analysis. These byproducts happened when the AI model was statically reasoning about the reachability of a finding or dynamically validating another one and it discovered new bugs adjacent to what was being analyzed.
Out of the 66 new findings, we reported 54 to the respective stack vendors or project maintainers because we believed they still affected latest versions of their products. These findings are broken down per stack and fix status below.
| Stack | New Findings | Status | Links to Fixes or Advisories |
|---|---|---|---|
| Contiki | 4 | Fixed | Link 1, Link 2, Link 3, and Link 4 |
| Ethernut | 1 | No response | n/a |
| FNET | 3 | Fixed | Link |
| PicoTCP | 5 | Fixed | Link |
| Nucleus NET | 5 | Fixed | Link |
| wolfIP | 3 | Fixed | Link 1 and Link 2 |
| lwIP | 4 | Fixed | Link 1, Link 2, Link 3 |
| S1 | 7 | Investigating | n/a |
| S2 | 10 | Investigating | n/a |
| S3 | 12 | Investigating | n/a |
Most of these new vulnerabilities are either high or critical severity and affect core components of the TCP/IP stacks instead of application level or other protocols, as shown below.
3.2. Time, Cost, and Precision
The table below shows the time and cost incurred when running the static analysis stages of the harness.

Some results are clear from the table:
- Across ten TCP/IP stacks, the pipeline processed 362 candidate findings for roughly $935, an average of $2.58 per finding.
- Cost per finding was between $0.95 and $4.16, roughly scaling with the number of static findings. The number of sinks and groups in stage 1 is a fair predictor of the total analysis cost.
- Stages 1 through 3 took around ten hours of wall-clock time in total for all ten targets.
- Source-code targets averaged less than 40 minutes each, and binary targets took around 90 minutes (2.3 times longer).
- The stage 1 scanner finished every source-code target in under two minutes, while binary targets averaged 30 minutes.
Because dynamic analysis is interactive, we do not have precise measurements of time and costs for stages 0 and 4, but we estimated costs between $15-30 for open-source targets and between $50-300 for binaries.
In general, source code targets are faster and less expensive to analyze. Static analyzers work better on source code, and AI agents can understand the intent of the code based on comments and documentation files to draw conclusions faster. The dynamic analysis stage can easily compile source code with the right flags, modules, and libraries to test all the findings. It is the ideal environment for vulnerability research.
Binary targets were much more complex. Static analysis of binary stacks was on average six times more expensive and took twice as long for the following reasons:
- Decompiled targets produced 2-3x more sinks during static analysis than open-source stacks and 5-10x more sinks survived the reachability filtering stage.
- The Ghidra disassembler and decompiler may produce inaccuracies that result into more false positives. Every false positive missed during early analysis stages generates more analysis costs later – this can be a 3-7x increase in the costs per finding.
- Static analysis queries run much longer on binaries because bytecode gets decompiled and converted into the CPG representation used by Joern.
- Raw firmware images need LLM-assisted preprocessing (stage 0) that can significantly influence the total wall-clock time. The S1 analysis took around 67 minutes for Stage 0 (22 minutes for function renaming alone) while only additional 13 minutes were spent on Stage 1 (SAST scan).
Dynamic analysis is also considerably more complex for binary targets (stage 4 in particular). With no source code to build, the only way to obtain a running target is to emulate the binary, which presents an entirely new set of challenges. This is reflected in the estimated costs of $50–300 for running stage 4 on our binary targets compared with $15–30 per source-code targets.
Across the ten stacks, 362 static analysis findings became 312 unique candidates after deduplication and then 99 confirmed issues. Per-stack precision – the rate of true positive findings – ranged from 11% to 70%. In the best case, roughly one finding in three was wrong; in the worst, nine in 10. This shows how much the addition of AI reasoning improves on the findings of traditional static analysis.
| TCP/IP Stack | Candidates | Confirmed Issues | Precision | Artifact Type |
|---|---|---|---|---|
| S2 | 23 | 16 | 70% | Binary |
| FNET | 9 | 6 | 67% | Source |
| wolfIP | 5 | 3 | 60% | Source |
| Ethernut | 20 | 11 | 55% | Source |
| Contiki | 40 | 17 | 43% | Source |
| S3 | 32 | 12 | 38% | Binary |
| lwIP | 13 | 4 | 31% | Source |
| PicoTCP | 44 | 12 | 27% | Source |
| Nucleus NET | 53 | 10 | 19% | Binary |
| S1 | 73 | 8 | 11% | Binary |
| Total | 312 | 99 | 42% (average) | – |
As with time and cost, precision was better for source code than binaries. Source-code targets averaged 47% precision compared with 34% for binaries. The average precision for binaries decreases to 22% if we remove the outlier S2. That stack was an outlier because the binary demo application retained symbols and ELF headers, which is rare for proprietary code, but makes disassembly, decompilation, and rule-based vulnerability scanning much easier.
3.3. Legacy Software and the Supply Chain
When we concluded Project Memoria at the end of 2021 and looked back at its results in 2022, we listed several lessons learned beyond the vulnerabilities we disclosed. Six years later and with AI enabling faster and cheaper discovery of vulnerabilities, some of those same lessons are more relevant than ever:
- Legacy software enables the connected world. At the start of Project Memoria, the average age of the analyzed TCP/IP stacks was almost 20 years. Now, some are no longer supported. . Similarly, one of the stacks for which disclosure is still ongoing had the end of general support in December 2025 and will see the end of extended support in September 2027. As software ages, the likelihood of patches ever becoming available decreases.
- Hundreds of products across several industries are impacted because of the supply chain. These TCP/IP stacks are embedded in several products used in operational technology, medical devices, network equipment, IoT, and others. At the end of Project Memoria we identified more than 100 products from dozens of vendors that were affected. In this new round of vulnerabilities, Siemens was the first to identify vulnerable devices: several building automation controllers in the APOGEE, Desigo and TALON product lines run Nucleus NET and are susceptible to the newly discovered issues. Other vendors are still investigating, but one case in particular made us think again about the supply chain. The version of the S1 stack we analyzed was embedded in the firmware of a discontinued wireless access point, as part of a third-party operating system. Not only that access point is now discontinued but the company that produced it is defunct. Yet, in the process of analyzing S1, our harness identified seven vulnerabilities specific to these devices, including buffer overflow via firmware upload and hardcoded administrator credentials that cannot be changed for web and shell management. Unsupported legacy products such as this access point abound and AI-enhanced research can now quickly and inexpensively uncover dangerous vulnerabilities for which no vendor will be able to provide a patch.
- Supply chain vulnerabilities are here to stay. It was quite surprising to find that many foundational vulnerabilities on core networking protocol implementations survived for years in the re-analyzed targets even after Project Memoria. They were missed by us, other researchers, and the software vendors themselves. Hopefully, the advent of AI-enabled research will make deeper analysis of critical software more feasible and eradicate this type of flaw, but for now many supply chain vulnerabilities are here to stay.
4. Conclusion and Mitigation Recommendations
This research shows that even with generally available models and a limited budget, humans with AI assistance can find vulnerabilities on open source and binary targets that are relevant to critical infrastructure for a fraction of the time and cost incurred until very recently.
The accelerated pace of vulnerability finding and exploitation with AI means that vendors must address a growing number of patches and that end users can no longer rely on patching alone as a viable security strategy.
We recommend asset owners and end users to:
- Assess and prioritize risk based on reachability, exploitability and operational impact. Treat vulnerabilities differently based on contextual information, including a device’s role, network exposure, compensating controls, and potential operational consequences. When vulnerabilities cannot be patched, it’s crucial to know what risk they really bring to the business, in order to make informed decisions about security controls.
- Reduce unnecessary exposure of devices. Disable or restrict high-risk services, such as FTP, Telnet, IPv6 and web administration interfaces wherever possible. Point devices at internal DNS servers instead of external resolvers. Implement secure remote access to replace flat VPN access and shared credentials with brokered, least-privilege access to reduce the paths available to an attacker seeking to reach vulnerable controllers.
- Isolate devices that cannot be patched. Put end-of-life devices and other unsupported products in tightly restricted network segments. Allow only the traffic they need, and plan to replace them. AI makes it cheap to find new flaws in these devices, but no one will ever fix them.
- Shorten the time to patch when fixes exist. After patches are published, the risk depends on how quickly end users apply them. Patching embedded devices is notoriously difficult, but organizations need to re-evaluate and accelerate patching processes to keep up with a faster rate of disclosures.
- Make security part of procurement. Require suppliers to state support lifetimes, publish a vulnerability disclosure policy, provide software bills of materials (SBOMs) and show evidence of ongoing security testing, including AI-assisted testing.
Software vendors and maintainers should:
- Use AI to find bugs before attackers do. Add AI-assisted static analysis to development and release pipelines, and rerun variant analysis on code that was already audited. Our harness rediscovered 40% of past bugs and found 66 new ones, which shows that one round of research and analysis does not make a product secure.
- Expand capacity to handle more reports. Expect more AI-generated vulnerability reports, many of them low quality, and invest in triage and coordinated disclosure processes so real issues don’t get buried.
Appendix: Vulnerability Details
The table below shows the details of the vulnerabilities that have already been fixed. Vulnerabilities affecting S1, S2 and S3 are not shown because they are still ongoing responsible disclosure. We have requested CVE IDs for the vulnerabilities affecting open-source software to MITRE and are still waiting for their assignment. The table will be updated once those IDs become available.
| ID | Stack | Description |
|---|---|---|
| FSCT-2026-0006 | lwIP | The out-of-sequence merge loop in tcp_receive() copies a FIN flag from a queued segment back onto the current segment without checking that tcplen still fits within rcv_wnd. Under specific conditions, this lets a remote attacker crash lwIP by connecting to an open TCP port. |
| FSCT-2026-0007 | lwIP | The MQTT client’s mqtt_parse_incoming() enters an infinite loop when processing a PUBLISH message delivered as a chained pbuf. A malicious MQTT broker can hang the lwIP main thread with a crafted PUBLISH message, freezing all network services on the device. |
| FSCT-2026-0008 | lwIP | The SMTP client copies email fields (from, to, subject) into a fixed 256-byte buffer without length validation. Fields longer than 240 characters overflow the buffer, crashing the process or overwriting adjacent heap data including a function pointer. |
| FSCT-2026-0009 | lwIP | The TFTP server’s tftp_recv() calls sys_timeout() before validating the request, and on rejection never calls sys_untimeout(), leaking one pool entry per failed RRQ/WRQ until the fixed-size pool is exhausted and the process is aborted. |
| FSCT-2026-0010 | wolfIP | The STM32 HAL Ethernet driver copies a received frame from a fixed 1536-byte – CONFIG DEPENDANT static DMA buffer (rx_buffer) into the caller-supplied frame buffer using a length that originates from the network (the MAC’s on-wire frame-length counter, delivered via HAL_ETH_RxLinkCallback Length parameter). The copy length is bounded only against the destination buffer size, never against the 1536-byte source buffer. An attacker on the same L2 segment who causes the MAC to report a frame length greater than 1536 (such as an oversized/jumbo or malformed frame) makes hal_eth_poll() read past rx_buffer, copying adjacent memory into the wolfIP receive path. |
| FSCT-2026-0011 | wolfIP | The Pico USB-server port presents the device to a USB host as a CDC-ECM/RNDIS or CDC-NCM virtual network adapter. Inbound frames arrive through TinyUSB, which calls tud_network_recv_cb(const uint8_t *src, uint16_t size) with a host-supplied length. That callback passes size straight into tusb_net_push_rx(), which memcpy() size bytes into a static receive buffer with no upper-bound checks. |
| FSCT-2026-0012 | wolfIP | When ESP transport is compiled in, ip_recv() unwraps an ESP packet (shrinking the frame length) and then strips IP options using a length computed before the unwrap. A crafted ESP packet whose outer header carries IP options (IHL > 5) underflows the option-stripping memmove() size to approximately 4 GiB and crashes the stack. |
| FSCT-2026-0013 | Contiki | The ROLL Trickle-Multicast (TM) ICMPv6 input handler walks a list of sequence_list_header structures embedded in the ICMPv6 payload. Each header carries a one-byte seq_len count of 16-bit sequence values that follow it. seq_len is taken directly from the attacker-controlled packet and is never validated against the actual payload length. A crafted message with a large seq_len (up to 255) makes the parser iterate up to 510 bytes past the header, reading well beyond uip_buf. On the default IEEE 802.15.4 target (uip_buf = 128 bytes) this walks hundreds of bytes into adjacent BSS memory. A single on-link ICMPv6 packet triggers it. |
| FSCT-2026-0014 | Contiki | The ip64 gateway’s DHCPv4 client parses the option (TLV) area of a DHCP reply using an attacker-controlled length byte, with two compounding defects: (1) the loop’s end bound is computed 240 bytes past the true end of the packet, and (2) the option cursor is advanced by optptr += optptr[1] + 2 with no check that the step stays inside the packet. A rogue DHCP server on the gateway’s IPv4 segment can drive the parser off the end of uip_buf, and on Contiki’s 16-bit targets (MSP430, AVR, CC2430) can wrap the option pointer to low memory. This is the same parser defect as the standalone uIP DHCP client, duplicated in the ip64 module. |
| FSCT-2026-0015 | Contiki | Contiki RPL node that receives a DODAG Information Object (DIO) for a new RPL instance parses a Prefix-Information option and stores its length byte without validating that it is ≤ 128. That byte later drives a memcpy() whose size is (length + 7) / 8 bytes into a 16-byte stack variable. With length = 255 the copy is 32 bytes, overflowing the 16-byte destination by 16 bytes onto the stack of check_prefix(). A single crafted, unauthenticated ICMPv6 RPL DIO from an on-link node triggers it. |
| FSCT-2026-0016 | Contiki | The NAT64 gateway’s IPv6→IPv4 translator sizes its copy from the attacker- controlled IPv6 payload-length header field but validates it against the total received length instead of the length minus the 40-byte IPv6 header. The guard is therefore loose by 40 bytes, and there is no destination-capacity check. An IPv6 packet whose payload-length field is inflated to the full received size makes the memcpy() write up to 20 bytes past the end of the fixed ip64_packet_buffer. Any node on the gateway’s internal (IPv6) side can trigger it unauthenticated. |
| FSCT-2026-0017 | PicoTCP | The IP fragment reassembly path in PicoTCP-NG does not enforce an upper bound on the accumulated datagram length, and an integer truncation between the allocation size and the copy size allows the reassembled payload to be copied into an undersized heap buffer. A network-adjacent, unauthenticated attacker triggers the overflow by sending a crafted series of fragments. |
| FSCT-2026-0018 | PicoTCP | The socket accept API in PicoTCP-NG writes the peer address into a caller-supplied buffer whose size cannot be communicated to the library (no addrlen parameter, unlike POSIX accept). When an IPv6 listener is used with a smaller address buffer, a remote peer connecting to the listener overflows the buffer with attacker-controlled address bytes. |
| FSCT-2026-0019 | PicoTCP | The UDP receive path in PicoTCP-NG computes the payload length by subtracting the UDP header size from a transport length that is not lower bounded on ingress. A crafted IPv4/UDP packet with a short transport length causes the subtraction to underflow, and the resulting oversized length drives a copy that reads far past the received packet into adjacent memory. The optional UDP checksum can be bypassed as permitted by RFC 768. Reachable by any application with a bound UDP socket. |
| FSCT-2026-0020 | PicoTCP | The DNS client in PicoTCP-NG walks a name field looking for a terminator without bounding the scan against the received response length, and it does so before validating the DNS header / transaction ID. A response that omits the terminator causes the walk to read past the response buffer. |
| FSCT-2026-0022 | PicoTCP | The IPv4 input handler in PicoTCP-NG validates the transport length against a bound that does not account for the IP options length, so the transport region can extend past the end of the allocated frame. A downstream handler that reads the full transport length (for example the ICMPv4 checksum routine) then performs an out-of-bounds read. Triggerable by a single unauthenticated IPv4 packet carrying IP options. |
| FSCT-2026-0023 | FNET | An off-by-one in the segment-search loop of the netbuf pullup helper causes an unsigned length computation to underflow when a multi-segment netbuf chain is presented, driving a subsequent copy with an oversized length into an undersized heap buffer. Reachable by sending three crafted IP fragments to any device with IPv4 fragmentation enabled, before checksum verification or socket lookup. |
| FSCT-2026-0024 | FNET | The transmit loop of the Azure Socket-IO adapter handles only success and error returns from the send call and does not handle the “no progress” return that FNET produces when the TCP send buffer is full. Under that condition the loop spins on the same pending item without ever invoking the stack poll routine, so incoming window updates are never processed and the condition can never clear. |
| FSCT-2026-0025 | FNET | The Neighbor Discovery option-parsing loop, validates only that the two-byte option header lies within the received packet and does not check that the full option body fits. A crafted ICMPv6 message with a truncated option body is accepted, and subsequent reads of option fields access memory past the end of the received packet. The bytes read are then stored into the neighbor cache or DNS resolver list. |
| CVE-2026-120596 | Ethernut | A remotely exploitable denial-of-service vulnerability exists in the TCP options parser of Nut/OS. An unauthenticated attacker can send a single TCP segment containing an unknown option type with a length byte of zero to any open TCP port, causing the TCP receive thread to enter a non-terminating loop that permanently hangs all TCP processing on the device. |
| CVE-2026-89208 | Nucleus NET | The affected product does not properly validate input bounds before accessing packet data. This could allow an unauthenticated remote attacker to trigger memory reads outside the intended packet boundaries. |
| CVE-2026-102073 | Nucleus NET | The affected product web service does not properly validate the length of user-controllable input. This could allow an unauthenticated remote attacker to read portions of device memory or to cause a denial-of-service condition. |
| CVE-2026-102074 | Nucleus NET | The affected product FTP service does not properly validate the length of user-controllable input. This could allow an unauthenticated remote attacker to cause a denial of service. |
| CVE-2026-102075 | Nucleus NET | The affected product web service does not properly validate user input in multipart handling. This could allow an unauthenticated remote attacker to cause a denial of service. |
| CVE-2026-102076 | Nucleus NET | The affected product web service does not properly validate user-supplied input in upload code. This could allow an unauthenticated remote attacker to cause a denial of service. |
Frequently Asked Questions
Who conducted this research?
The research was conducted by Forescout Research – Vedere Labs, with research credited to Stanislav Dashevskyi, Francesco La Spina, and Daniel dos Santos. The work builds on Project Memoria, Forescout’s earlier research into vulnerabilities in embedded TCP/IP stacks.
What was the purpose of this research?
The research examined whether security researchers, and potentially attackers, can use generally available AI models with a limited budget to discover vulnerabilities in open-source software and binary targets relevant to critical infrastructure. It also compared AI-assisted vulnerability discovery with Forescout’s earlier manual research.
What did the researchers analyze?
The researchers analyzed 10 TCP/IP stacks used in embedded and connected devices. Seven had previously been studied as part of Project Memoria and three were new targets. The study included both open-source code and proprietary binary software, allowing the researchers to evaluate AI-assisted analysis under different levels of code visibility.
What did the research find?
The AI-assisted research identified 99 vulnerabilities. Of those, 33 were previously known vulnerabilities rediscovered by the harness and 66 were new findings. Of the 66 new findings, 54 were reported to vendors or project maintainers because the researchers believed the vulnerabilities still affected current versions.
How serious were the new vulnerabilities?
Of the 66 new vulnerabilities, 52% were critical or high severity. The remaining findings included medium-severity and low-severity vulnerabilities.
Where were the vulnerabilities found?
The vulnerabilities were found across TCP/IP stacks used in embedded devices and software relevant to operational technology, medical devices, network equipment, IoT and other connected systems. Seventeen of the new vulnerabilities affected core IP, TCP, UDP, ICMP or Ethernet functionality, while others affected services and protocols including HTTP, IPv6, Telnet, DNS, DHCP, FTP, SNMP, SMTP, TFTP, MQTT and IPsec.
Why do these vulnerabilities matter for critical infrastructure?
TCP/IP stacks are foundational networking components embedded within many types of connected devices. A vulnerability in a stack can therefore propagate through the technology supply chain into products from multiple manufacturers. Previous Project Memoria research identified more than 100 affected products from dozens of vendors, illustrating how vulnerabilities in shared networking components can have consequences far beyond the original software.
How did the researchers use AI to find vulnerabilities?
The researchers built a specialized AI-assisted vulnerability research harness for embedded software, firmware and network protocols. It combines deterministic static analysis with AI reasoning, reverse engineering and dynamic verification. The workflow preprocesses targets, scans for candidate vulnerabilities, checks whether vulnerable code is reachable, evaluates exploitability and then attempts to dynamically validate potential vulnerabilities and generate proof-of-concept scripts.
What is the main takeaway from the research?
The central finding is that AI is materially reducing the time and marginal cost required to discover vulnerabilities in embedded software. The study found 99 vulnerabilities in roughly 90 hours, including 66 new vulnerabilities, using commercially available models and a specialized research harness. As AI capabilities improve, organizations should expect vulnerability discovery to accelerate and should prepare both their defensive processes and product-security programs accordingly.
What AI models and security tools were used?
The harness used models from the Claude family, with faster and less expensive Sonnet models for the initial analysis stages and Opus models for dynamic verification. The research also used security and reverse-engineering tools including Semgrep, Joern and Ghidra. Researchers developed 32 Joern static-analysis rules targeting vulnerability patterns commonly found in embedded TCP/IP stacks.
Was the vulnerability research completely autonomous?
No. The approach combined automated AI analysis with human supervision. The static-analysis and AI-reasoning stages were automated, while dynamic verification was implemented so researchers could intervene and guide the analysis when necessary. The reported 90-hour research time includes automated analysis and human validation.
How effective was the AI at rediscovering previously known vulnerabilities?
For the previously analyzed Project Memoria+ targets, the harness rediscovered 33 of 82 known vulnerabilities, or 40%. It also discovered 66 vulnerabilities that had not been identified in the earlier research or that affected newly analyzed stacks.
What types of vulnerabilities was the AI best at finding?
The harness was strongest at detecting memory-safety and protocol-parsing vulnerabilities. Of the 99 total vulnerabilities found, 48 involved memory corruption, 27 involved integer issues, 16 involved input-validation problems and eight involved control-flow or logic issues. The researchers found that implementation-specific logic and design flaws were generally harder for the rule-based approach to detect.
How much time and money did the AI-assisted analysis require?
The static-analysis stages processed 362 candidate findings across 10 TCP/IP stacks for approximately $935, averaging $2.58 per finding. Those stages took roughly 10 hours of wall-clock time. Including dynamic validation, the research identified the 99 vulnerabilities in approximately 90 hours. The researchers estimate total model spending for the study at roughly $1,200 to $2,300.
Was analyzing binaries harder than analyzing source code?
Yes. Static analysis of binary targets was approximately six times more expensive and took about twice as long as source-code analysis. Binary analysis introduces additional challenges including stripped function names, architecture-specific machine code, inaccuracies from disassembly and decompilation, larger numbers of false positives, and the need to emulate software originally designed for embedded hardware.
What does this research show about AI and vulnerability discovery?
The study demonstrates that generally available AI models, when combined with a purpose-built harness and human expertise, can significantly accelerate and reduce the marginal cost of vulnerability research. It also suggests that both attackers and defenders could increasingly use AI to examine many targets quickly, increasing the rate at which vulnerabilities are discovered.
What should asset owners and critical infrastructure operators do?
The researchers recommend that organizations prioritize vulnerabilities according to reachability, exploitability and operational impact; reduce unnecessary service exposure; isolate devices that cannot be patched; accelerate patching when fixes are available; and incorporate security requirements into procurement. Procurement requirements should include supplier support lifetimes, vulnerability disclosure policies, software bills of materials and evidence of continuing security testing.
What should software vendors and maintainers do?
Software vendors and maintainers should use AI-assisted security analysis to find vulnerabilities before attackers do and prepare for a larger volume of AI-generated vulnerability reports. That includes strengthening vulnerability triage, coordinated disclosure processes and the capacity needed to distinguish genuine security issues from low-quality reports.
