On August 31, 2026, the GeoNetwork project published details of two vulnerabilities that can be chained to achieve unauthenticated remote code execution on GeoNetwork — the open-source geospatial metadata catalog that quietly powers a large share of government, scientific, and intergovernmental geoportals worldwide. Fixes shipped on July 8, 2026 in versions 4.4.12 and 4.2.17. If your organization operates a GeoNetwork instance that has not been patched since July 2026, treat this as an active remediation priority, not a backlog item.
GeoNetwork is not a niche product. It originated at the United Nations Food and Agriculture Organization (FAO) and is deployed as the metadata and discovery backend behind national spatial data infrastructures, environmental agencies, geological surveys, agriculture ministries, and municipal GIS portals. These are exactly the systems nation-state actors and initial access brokers enumerate when mapping a country's public-facing infrastructure. An unauthenticated RCE on a public metadata catalog is a beachhead — the catalog server itself may hold little sensitive data, but it sits inside government network segments with trusted adjacency to GIS databases, internal APIs, and agency intranets.
The gap between patch availability (July 8) and full vulnerability disclosure (August 31) was a grace period. It is now over. Public technical detail historically compresses time-to-exploitation for Java-based unauthenticated RCEs to days, sometimes hours. Defenders need to patch, hunt, and harden — in that order, but ideally in parallel.
Technical Analysis
Affected products and versions
| Product | Affected versions | Fixed versions |
|---|---|---|
| GeoNetwork (4.4.x branch) | < 4.4.12 | 4.4.12 (released July 8, 2026) |
| GeoNetwork (4.2.x branch) | < 4.2.17 | 4.2.17 (released July 8, 2026) |
GeoNetwork is a Java web application typically deployed as a WAR on Apache Tomcat (or occasionally Jetty), backed by Elasticsearch for search indexing and either an embedded H2 database or an external RDBMS (PostgreSQL, Oracle) for metadata persistence. Deployments are predominantly Linux, though Windows Server installations exist in smaller agencies.
No CVE identifiers were included in the disclosure summary available at the time of writing. Track the GeoNetwork project's GitHub security advisories page for identifier assignment — do not wait for a CVE number to begin patching.
How the attack chain works (defender's view)
The disclosure describes a two-vulnerability chain: neither bug alone yields full compromise, but combined they allow a remote, unauthenticated attacker to execute arbitrary code on the GeoNetwork server. While the exact component-level details should be read directly from the project's advisory, the defensive-relevant characteristics of this class of Java web application chain are consistent:
- Entry point is an HTTP(S) request to the GeoNetwork web application — no credentials, no session, no CSRF token requirement. Everything the attacker needs is reachable by anyone who can reach the catalog's search/API endpoints.
- Code execution lands in the JVM process context — the Tomcat/Jetty service account (commonly
tomcat,www-data, or a dedicatedgeonetworkuser on Linux;SYSTEMor a service account on careless Windows installs). Whatever that account can touch, the attacker can touch: metadata databases, Elasticsearch indices, filesystem geodata stores, and any internal services the server can reach. - Post-exploitation is conventional — command execution via the Java runtime (
/bin/sh -c,bash,curl|shpayload retrieval), JSP or Java-based webshells dropped into the webapp directory for persistence, and credential harvesting from GeoNetwork's configuration files (database credentials live inWEB-INF/config-db/andjdbc.properties).
Exploitation status
- Public technical details: Published August 31, 2026.
- Confirmed in-the-wild exploitation: Not confirmed in the source reporting as of publication — but the patch-to-detail lag means scanning for vulnerable instances began the moment version fingerprints could be diffed against 4.4.12/4.2.17.
- CISA KEV: Not listed at time of writing; monitor for addition given the government-sector footprint.
The correct operating assumption for any internet-facing GeoNetwork instance older than the fixed versions is "exposed and likely already enumerated."
Detection & Response
This is a technical threat. The detections below target the two highest-fidelity post-exploitation behaviors: (1) the Java servlet container spawning shell/command processes, and (2) webshell artifacts appearing in the GeoNetwork deployment directory. Both are low-noise in properly managed environments — a healthy Tomcat hosting a metadata catalog does not routinely exec bash.
Sigma Rules
---
title: Java Servlet Container Spawning Shell or Command Interpreter
id: 3f8a2c91-7d4e-4b6a-9c15-2e8f0a1b3d47
status: experimental
description: Detects Tomcat, Jetty, or the Java runtime spawning shells or command interpreters, consistent with post-exploitation after RCE in a Java web application such as the GeoNetwork unauthenticated RCE chain disclosed August 2026.
references:
- https://thehackernews.com/2026/09/geonetwork-fixes-unauthenticated-rce.html
- https://attack.mitre.org/techniques/T1059/004/
author: Security Arsenal
date: 2026/09/01
tags:
- attack.execution
- attack.t1059.004
- attack.t1190
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/java'
- '/jsvc'
- '/catalina.sh'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/dash'
- '/zsh'
- '/curl'
- '/wget'
- '/python'
- '/python3'
- '/perl'
- '/nc'
- '/ncat'
- '/base64'
condition: selection_parent and selection_child
falsepositives:
- GeoNetwork administrative cron jobs or harvester scripts invoking curl from within container init wrappers
- Health-check sidecars in containerized deployments
level: high
---
title: Webshell or JSP File Written to GeoNetwork Web Application Directory
id: 9b1e5d38-2a6f-4c83-b741-5d0e7f2a8c96
status: experimental
description: Detects creation of new JSP or script files inside GeoNetwork/Tomcat web application directories, a common persistence mechanism following exploitation of Java web application RCE flaws.
references:
- https://thehackernews.com/2026/09/geonetwork-fixes-unauthenticated-rce.html
- https://attack.mitre.org/techniques/T1505/003/
author: Security Arsenal
date: 2026/09/01
tags:
- attack.persistence
- attack.t1505.003
logsource:
category: file_event
product: linux
detection:
selection_path:
TargetFilename|contains:
- '/webapps/geonetwork/'
- '/tomcat/webapps/'
- '/var/lib/tomcat'
- '/opt/geonetwork/'
selection_ext:
TargetFilename|endswith:
- '.jsp'
- '.jspx'
- '.sh'
- '.war'
condition: selection_path and selection_ext
falsepositives:
- Legitimate GeoNetwork upgrades or WAR redeployments (correlate with change windows)
- XSL/custom schema plugin installations performed by administrators
level: critical
Analyst note: The first rule will fire on containerized deployments where health checks exec shells from the JVM parent — scope it to production hosts with a known process baseline. The second rule is near-zero-noise outside of deployment windows; if you have change management, suppress by change ticket, not by host.
KQL (Microsoft Sentinel / Defender)
This query hunts Linux process telemetry ingested into Sentinel (via the Syslog/AMA connector or Defender for Endpoint onboarding of the catalog servers) for a Java runtime spawning command interpreters — the primary observable of the GeoNetwork RCE chain post-exploitation:
let Lookback = 14d;
union isfuzzy=true
(DeviceProcessEvents
| where TimeGenerated > ago(Lookback)
| where InitiatingProcessFileName has_any ("java", "jsvc")
| where FileName has_any ("sh", "bash", "dash", "curl", "wget", "python", "python3", "perl", "nc", "ncat", "base64")
| extend Host = DeviceName, ParentProc = InitiatingProcessFileName, ChildProc = FileName,
ChildCmd = ProcessCommandLine, Acct = AccountName, ProcTime = TimeGenerated),
(Syslog
| where TimeGenerated > ago(Lookback)
| where Facility == "user" or SyslogMessage has "geomcat" or SyslogMessage has "tomcat"
| where SyslogMessage has_any ("/bin/sh", "/bin/bash", "curl ", "wget ", "chmod +x", "base64 -d")
| extend Host = HostName, ParentProc = "tomcat", ChildProc = "", ChildCmd = SyslogMessage,
Acct = "", ProcTime = TimeGenerated)
| project ProcTime, Host, ParentProc, ChildProc, ChildCmd, Acct
| order by ProcTime desc
Run this across any host identified in your CMDB as running GeoNetwork, Tomcat, or a known geospatial stack. Any hit outside a documented deployment window warrants host isolation and memory capture before remediation.
Velociraptor VQL
For forensic triage of a suspected GeoNetwork host, this artifact surfaces both child processes of the servlet container and recently modified JSP/script artifacts in the web application path:
-- GeoNetwork RCE triage: suspicious JVM children and webshell artifacts
LET procs = SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Exe =~ '(?i)(java|jsvc)'
LET suspicious_children = SELECT Pid, Ppid, Name, CommandLine, Username, CreateTime
FROM pslist()
WHERE Ppid IN SELECT Pid FROM procs
AND (CommandLine =~ '(?i)(curl|wget|base64|chmod \+x|nc |ncat|python|perl)'
OR Exe =~ '(?i)(/bin/(ba)?sh|/usr/bin/(curl|wget|python|perl))')
LET webshells = SELECT FullPath, Size, Mtime, Ctime
FROM glob(globs=['/var/lib/tomcat*/webapps/**/*.jsp',
'/opt/tomcat/webapps/**/*.jsp',
'/usr/share/tomcat*/webapps/**/*.jsp',
'/opt/geonetwork/**/*.sh'])
WHERE Mtime > now() - 60*60*24*30
SELECT * FROM suspicious_children
UNION ALL
SELECT NULL AS Pid, NULL AS Ppid, 'FILE_ARTIFACT' AS Name, FullPath AS CommandLine,
NULL AS Username, Mtime AS CreateTime FROM webshells
Adjust the glob paths to your actual deployment layout. On a healthy catalog server, suspicious_children should return nothing and webshells should return only files whose mtimes align with your last legitimate deployment.
Remediation & Verification Script (Bash)
The following script inventories GeoNetwork deployments on a Linux host, reports the running version, flags suspicious child processes of the JVM, and checks for recently modified JSP artifacts. It is a verification and triage aid — it does not patch for you; upgrading GeoNetwork requires a proper WAR redeployment with configuration migration.
#!/bin/bash
# GeoNetwork RCE exposure verification script - Security Arsenal
# Run as root on the catalog host. Read-only; makes no changes.
echo "=== [1] Locating GeoNetwork deployments ==="
GN_DIRS=$(find /opt /var/lib /usr/share /srv -maxdepth 6 -type d -name "geonetwork" 2>/dev/null)
if [ -z "$GN_DIRS" ]; then
echo "No GeoNetwork webapp directory found under standard paths. Check custom deployment roots."
else
echo "$GN_DIRS"
fi
echo ""
echo "=== [2] Checking deployed version ==="
for d in $GN_DIRS; do
POM_PROPS=$(find "$d" -name "pom.properties" -path "*geonetwork*" 2>/dev/null | head -1)
if [ -n "$POM_PROPS" ]; then
grep -E "^version" "$POM_PROPS"
fi
# Fallback: version marker in web.xml / manifest
find "$d" -name "MANIFEST.MF" -exec grep -H "Implementation-Version" {} \; 2>/dev/null
done
echo "REQUIRED: 4.4.12 or later (4.4.x branch) / 4.2.17 or later (4.2.x branch)"
echo ""
echo "=== [3] Suspicious child processes of the JVM ==="
JVM_PIDS=$(pgrep -f "java|catalina|jsvc" | tr '\n' ' ')
for pid in $JVM_PIDS; do
ps --ppid "$pid" -o pid,ppid,user,comm,args 2>/dev/null | grep -E "sh$|bash|curl|wget|python|perl|nc |ncat" && echo " ^^ ALERT: investigate parent PID $pid"
done
echo "(no output above this line = no suspicious children found)"
echo ""
echo "=== [4] Recently modified JSP/script files in webapp dirs (last 30 days) ==="
for d in $GN_DIRS; do
find "$d" -name "*.jsp" -o -name "*.jspx" -o -name "*.sh" 2>/dev/null | while read -r f; do
if [ "$(find "$f" -mtime -30 2>/dev/null)" ]; then
stat -c '%y %n' "$f"
fi
done
done
echo ""
echo "=== [5] Database credential files to rotate if compromise suspected ==="
for d in $GN_DIRS; do
find "$d" -path "*config-db*" -name "*.properties" 2>/dev/null
find "$d" -name "jdbc.properties" 2>/dev/null
done
echo ""
echo "Verification complete. If any ALERT was raised, isolate the host and capture memory before redeploying."
Remediation
- Upgrade immediately. Deploy GeoNetwork 4.4.12 (4.4.x branch) or 4.2.17 (4.2.x branch), released July 8, 2026. Obtain builds only from the official GeoNetwork project (geonetwork-opensource.org / GitHub releases) and verify release checksums. A WAR redeployment is required — plan for metadata index rebuild time on large catalogs.
- Inventory first. Most organizations that own GeoNetwork don't know it. Search your external attack surface and internal CMDB for Tomcat instances serving metadata catalog endpoints, and check any system integrating with national spatial data infrastructure (SDI) programs. Government contractors: check deliverable portals standing up catalog services for agency customers.
- Hunt before you patch if the instance was internet-facing and unpatched after August 31, 2026. Use the Sigma/KQL/VQL content above. Patch-then-hunt destroys evidence; capture process listings, webapp directory state, and Tomcat access logs first if you have any reason to suspect exposure.
- Rotate credentials on suspicion. GeoNetwork stores database credentials in plaintext properties files under
WEB-INF/config-db/. If compromise is possible, rotate DB credentials, Elasticsearch API keys, any harvester credentials (GeoNetwork stores remote harvest source logins), and service account passwords. - Reduce exposure independent of patching:
- Place GeoNetwork behind a reverse proxy or WAF; restrict access to administrative endpoints (
/srv/*/admin, harvester management) to authorized networks. - Run the servlet container as a dedicated low-privilege account — never root, never a domain-joined privileged account.
- Segment the catalog server. It needs its database and Elasticsearch; it does not need SMB to file servers or LDAP write access to your directory.
- Place GeoNetwork behind a reverse proxy or WAF; restrict access to administrative endpoints (
- Restrict egress. A compromised catalog server that cannot reach the internet cannot pull second-stage payloads or exfiltrate. Allowlist outbound destinations (package mirrors, harvest targets) and alert on anything else.
- Monitor CISA KEV and the GeoNetwork security advisories page for CVE assignment and exploitation reporting. If your sector mandates KEV-driven remediation timelines, pre-stage this system in your vulnerability management workflow so a KEV addition triggers your SLA clock automatically.
For organizations without internal capacity to validate remediation or hunt for pre-patch compromise, this is exactly the class of engagement where a targeted compromise assessment pays for itself — the dwell time between July and September 2026 is the window attackers had to work with.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.