{"id":"CVE-2026-102511","revision":null,"records":[{"revision":"8d5f6d1615e54ee78eae548f08e74740","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2026-102511","aliases":[],"title":"Apache PLC4X, Apache PLC4X, Apache PLC4X, Apache PLC4X: ADS discovery accepts spoofed responses and derives the connection target from them","description":"Improper Verification of Source of a Communication Channel in the ADS discovery of the Go implementation of Apache PLC4X (PLC4Go) allows an attacker able to send UDP datagrams to the discovering host to redirect subsequent connections to an arbitrary, attacker-chosen address. The discovery result's connection \naddress was derived from the AmsNetId claimed in the response body rather than from the datagram's actual source address. One spoofed discovery response can therefore insert an inventory entry pointing at any host, including hosts outside the local network, and an application that connects to discovered devices\nwill open its ADS session, including any configured route credentials, to that host.\n\nAdditionally, discovery listeners in both implementations can be disabled by a single malformed datagram:\n- In PLC4Go ADS discovery, a short version block causes a panic that ends the listener for the rest of the discovery call, so legitimate devices answering afterwards are not reported.\n- In PLC4J, the ADS and EtherNet/IP discoverers stop on an unhandled exception from a malformed response.\n- The PLC4J Modbus discoverer can be made to spin indefinitely, consuming a CPU core, by a scanned host that sends a partial response.\n\nExploitation requires the application to invoke the discovery API, which is opt-in, and for the connection redirect, to act on the discovered items.\n\nThis issue affects Apache PLC4X: PLC4Go from 0.11.0 before 1.0.0; PLC4J ADS and Modbus drivers from 0.10.0 before 1.0.0; PLC4J EtherNet/IP driver from 0.11.0 before 1.0.0. PLC4Go is consumed as the Go module github.com/apache/plc4x/plc4go; versions refer to the corresponding Apache PLC4X releases.\n\nUsers are recommended to upgrade to version 1.0.0, which fixes the issue. Version 1.0.0 derives the connection address from the datagram's source address and logs a warning when the claimed AmsNetId disagrees with it.","state":0,"publishedAt":"2026-09-30T08:03:04.359+00:00","modifiedAt":"2026-09-30T16:43:46.02+00:00","affected":[{"ecosystem":"https://golang.org/pkg","name":"github.com/apache/plc4x/plc4go","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"Apache Software Foundation\",\n                    \"product\": \"Apache PLC4X\",\n                    \"packageURL\": \"pkg:golang/github.com/apache/plc4x/plc4go\",\n                    \"versions\": [\n                        {\n                            \"status\": \"affected\",\n                            \"version\": \"0.11.0\",\n                            \"lessThan\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"status\": \"unaffected\",\n                            \"version\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        }\n                    ],\n                    \"defaultStatus\": \"unaffected\",\n                    \"collectionURL\": \"https://golang.org/pkg\",\n                    \"packageName\": \"github.com/apache/plc4x/plc4go\"\n                }"},{"ecosystem":"https://repo.maven.apache.org/maven2","name":"org.apache.plc4x:plc4j-driver-ads","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"Apache Software Foundation\",\n                    \"product\": \"Apache PLC4X\",\n                    \"packageURL\": \"pkg:maven/org.apache.plc4x/plc4j-driver-ads\",\n                    \"versions\": [\n                        {\n                            \"status\": \"affected\",\n                            \"version\": \"0.10.0\",\n                            \"lessThan\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"status\": \"unaffected\",\n                            \"version\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        }\n                    ],\n                    \"defaultStatus\": \"unaffected\",\n                    \"collectionURL\": \"https://repo.maven.apache.org/maven2\",\n                    \"packageName\": \"org.apache.plc4x:plc4j-driver-ads\"\n                }"},{"ecosystem":"https://repo.maven.apache.org/maven2","name":"org.apache.plc4x:plc4j-driver-modbus","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"Apache Software Foundation\",\n                    \"product\": \"Apache PLC4X\",\n                    \"packageURL\": \"pkg:maven/org.apache.plc4x/plc4j-driver-modbus\",\n                    \"versions\": [\n                        {\n                            \"status\": \"affected\",\n                            \"version\": \"0.10.0\",\n                            \"lessThan\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"status\": \"unaffected\",\n                            \"version\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        }\n                    ],\n                    \"defaultStatus\": \"unaffected\",\n                    \"collectionURL\": \"https://repo.maven.apache.org/maven2\",\n                    \"packageName\": \"org.apache.plc4x:plc4j-driver-modbus\"\n                }"},{"ecosystem":"https://repo.maven.apache.org/maven2","name":"org.apache.plc4x:plc4j-driver-eip","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"Apache Software Foundation\",\n                    \"product\": \"Apache PLC4X\",\n                    \"packageURL\": \"pkg:maven/org.apache.plc4x/plc4j-driver-eip\",\n                    \"versions\": [\n                        {\n                            \"status\": \"affected\",\n                            \"version\": \"0.11.0\",\n                            \"lessThan\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"status\": \"unaffected\",\n                            \"version\": \"1.0.0\",\n                            \"versionType\": \"semver\"\n                        }\n                    ],\n                    \"defaultStatus\": \"unaffected\",\n                    \"collectionURL\": \"https://repo.maven.apache.org/maven2\",\n                    \"packageName\": \"org.apache.plc4x:plc4j-driver-eip\"\n                }"}],"metrics":[{"system":"CVSS 4.0","vector":"CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N","score":8.5,"severity":"HIGH"}],"references":["https://lists.apache.org/thread.html/g692j4fklrbo80stjr5ll8xghrwszthf"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-102511","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-102511","identifiers":["CVE-2026-102511"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-12T03:56:46.1287087+00:00","complete":true,"records":1779,"lastAttemptAt":"2026-11-12T03:56:46.1287087+00:00","lastSuccessAt":"2026-11-12T03:56:46.266109+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:46.2661097+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-64752486c567b55b31fb0d7225f5222bcd0019564ac0ac5f0649e242c7b19299-beddb039e9e8d22605e2eaa29616069a8dbcaa39d8913522266b856ccc773385","complete":true,"records":424562,"lastAttemptAt":"2026-11-12T03:56:45.0720206+00:00","lastSuccessAt":"2026-11-12T03:56:45.0520395+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:45.0720206+00:00","snapshotPublishedAt":"2026-11-12T03:29:06+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-ea419175ecf14a039888f2d153bed058","complete":false,"records":13760,"lastAttemptAt":"2026-11-12T04:04:45.7219099+00:00","lastSuccessAt":"2026-11-12T04:04:45.7938733+00:00","error":null,"lastVerifiedAt":"2026-11-12T04:04:45.7938733+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-12T03:56:46.1287087+00:00","complete":true,"records":1097,"lastAttemptAt":"2026-11-12T03:56:46.1287087+00:00","lastSuccessAt":"2026-11-12T03:56:46.2668013+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:46.2668014+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-52451a58cbcb4287967102045f86ce70","complete":true,"records":13760,"lastAttemptAt":"2026-11-12T03:56:47.5828253+00:00","lastSuccessAt":"2026-11-12T03:56:47.579+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:47.579+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13813,"expectedIdentifiers":13813,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-3562b6c78fd1bd0f0b55daf66a0926ae24f65e462df7f6d928caad458fc696bf","complete":true,"records":9947,"lastAttemptAt":"2026-11-12T03:56:45.7079161+00:00","lastSuccessAt":"2026-11-11T04:27:43.6877707+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:45.7079161+00:00","snapshotPublishedAt":"2026-11-11T03:32:46+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-456002455e0ab94bb92c95476d4e6d175c104cd594749982afd96c893728ecbc","complete":true,"records":2010,"lastAttemptAt":"2026-11-12T03:56:45.2248127+00:00","lastSuccessAt":"2026-11-11T02:36:58.1276999+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:45.2248127+00:00","snapshotPublishedAt":"2026-11-11T01:17:51+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-baa8362b4daf9e5f39d5563775a55935e7b442c0735d33274a921579ce4a0d66","complete":true,"records":3093,"lastAttemptAt":"2026-11-12T03:56:46.0887439+00:00","lastSuccessAt":"2026-11-11T13:00:02.5446881+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:46.0887439+00:00","snapshotPublishedAt":"2026-11-11T12:47:47+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-685fe7fb2b690656c910a1ea42a9d294e8353311ac8ecfa691a9b0ff1b328804","complete":true,"records":231695,"lastAttemptAt":"2026-11-12T03:56:45.6007038+00:00","lastSuccessAt":"2026-11-11T21:58:47.7265713+00:00","error":null,"lastVerifiedAt":"2026-11-12T03:56:45.6007038+00:00","snapshotPublishedAt":"2026-11-11T21:48:35+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}