T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/server.py:146- Finding
Unauthenticated Local ArcPy Service Can Be Invoked by Untrusted Websites or Local Processes
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This ArcGIS skill is purpose-aligned, but it exposes a powerful unauthenticated local service that can modify GIS files and use active ArcGIS portal authority.
Install only if you are comfortable running a local ArcGIS automation server. Before use, restrict INCLUDE_MODULES to the specific toolboxes you need, add authentication or keep the port inaccessible to browsers and untrusted local processes, disable overwriteOutput by default, and avoid running it while signed into sensitive Portal or ArcGIS Online accounts.
scripts/server.py:146Unauthenticated Local ArcPy Service Can Be Invoked by Untrusted Websites or Local Processes
scripts/server.py:110Path Whitelist Can Be Bypassed Through Traversal, Nested Values, and Unsupported Resource Forms
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| indoors / indoorpositioning | 22/8 | Indoor GIS / positioning | Indoors |
| maritime / bathymetry | 22/8 | S-57 charts, bathymetry | Maritime |
| ca / td / intelligence | 13/19/18 | Crime analysis / territory design / intelligence | respective ext. |
| rm / oi / reviewer / wmx / transit / geoai | 14/6/5/18/8/12 | Ortho mapping / oriented imagery / QA / workflow / GTFS / GeoAI | respective ext. |
**Portal / Enterprise modules** (calls require an active Portal or ArcGIS Online sign-in): `ra`, `geoanalytics`, `gapro`, `sfa`, `agolservices`
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| indoors / indoorpositioning | 22/8 | Indoor GIS / positioning | Indoors |
| maritime / bathymetry | 22/8 | S-57 charts, bathymetry | Maritime |
| ca / td / intelligence | 13/19/18 | Crime analysis / territory design / intelligence | respective ext. |
| rm / oi / reviewer / wmx / transit / geoai | 14/6/5/18/8/12 | Ortho mapping / oriented imagery / QA / workflow / GTFS / GeoAI | respective ext. |
**Portal / Enterprise modules** (calls require an active Portal or ArcGIS Online sign-in): `ra`, `geoanalytics`, `gapro`, `sfa`, `agolservices`
The skill exposes network and environment-dependent capabilities but does not declare an explicit tool scope such as allowed tools or permissions. That increases the chance an orchestrator or user invokes the skill in broader contexts than intended, especially since it can trigger local HTTP requests and launch a local Python server tied to ArcGIS Pro.
The activation text is very broad ('use when the user asks for GIS/spatial analysis, ArcGIS automation, or arcpy operations'), which can cause the skill to activate for many generic requests. In this skill, overbroad activation is more dangerous because activation can lead to file-writing geoprocessing operations and local service interaction without clear user intent boundaries.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s http://127.0.0.1:8765/health
# {"status":"ok","server":"arcpy-mcp-server","version":"2.1","tools":2500,"modules":46}
The examples demonstrate POST /call operations that write output datasets before clearly foregrounding overwrite and write-target risks. Because the skill can create or modify GIS outputs on disk through powerful geoprocessing tools, insufficient upfront warnings may lead to unintended data alteration or destructive writes.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -s http://127.0.0.1:8765/health
# {"status":"ok","server":"arcpy-mcp-server","version":"2.1","tools":2500,"modules":46}
The file presents all user prompts, AI actions, and replies exclusively in Chinese, including the title and every example interaction. Because no opt-in, alternative language option, or region-specific justification is provided, this constitutes a natural-language locale policy concern under the language/locale rule.
The server registers portal- and enterprise-facing toolboxes such as ra, geoanalytics, gapro, sfa, and agolservices even though the skill is described as a local ArcGIS Pro HTTP API. This expands the trust boundary from local geoprocessing into remote service/portal actions, potentially enabling unintended access to organizational content, publishing workflows, or remote data processing if the host is signed into ArcGIS Enterprise or ArcGIS Online.
The HTTP API permits remote execution of powerful ArcPy tools without any user warning, confirmation, authentication, or operation-class gating. Because many ArcPy tools can delete, overwrite, publish, transform, or exfiltrate data, a local or proxied caller can trigger impactful actions silently, which is especially risky in an agent skill intended for natural-language automation.
The /call endpoint executes any registered ArcPy tool with caller-supplied arguments and globally enables overwriteOutput=True, allowing remote creation, modification, and replacement of datasets. In this skill context, that is more dangerous because ArcPy includes many destructive and administrative geoprocessing tools, so the implementation exceeds a narrow 'analysis' interface and becomes a broad remote automation surface over local GIS data.
The top-level natural-language description is written only in Chinese and presents the skill as such without any indication that users can choose another language or locale. Under the language/locale policy, a skill should not impose a specific language without opt-in or documented justification.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
continue
if mod_name not in INCLUDE_MODULES:
continue
m = getattr(arcpy, mod_name)
tools = [t for t in dir(m) if not t.startswith('_') and t[0].isupper()]
for func_name in tools:
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
for func_name in tools:
tool_id = f"{mod_name}_{func_name}"
try:
func = getattr(m, func_name)
# Basic schema: just accept **kwargs
TOOL_REGISTRY[tool_id] = {
"module": mod_name,
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
arcpy.env.overwriteOutput = True
t0 = time.time()
mod = getattr(arcpy, tdef["module"])
func = getattr(mod, tdef["func"])
# Parse kwargs: handle both flat args and JSON string kwargs
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
t0 = time.time()
mod = getattr(arcpy, tdef["module"])
func = getattr(mod, tdef["func"])
# Parse kwargs: handle both flat args and JSON string kwargs
if "__kwargs" in args and len(args) == 1:
After tool execution, the server inspects output paths and returns metadata such as feature counts, geometry type, raster dimensions, and result strings over HTTP. This transmits local system or dataset-derived information to API clients, but the file does not provide a visible warning or explanatory disclosure about that behavior.