Ae1
- Category
- analysis-evasion
- Confidence
- 100% confidence
- Finding
Referenced artifact was not completely inspected
- Content
md For installation, configuration, and container setup, see [references/setup.md](references/setup.md).
Security audit
Security checks for vulnerabilities and agentic risk
This is a documented client for a self-hosted forecasting service, but it will send forecasting and training data to the server the user configures.
Install only if you control and trust the predictalot endpoint. Keep it bound to localhost unless you add TLS, a strong bearer token, and network access controls; avoid sending proprietary datasets to an untrusted URL. Pin the Docker image to a reviewed version or digest before production use, and confirm carefully before deleting stored models.
Referenced artifact was not completely inspected
For installation, configuration, and container setup, see [references/setup.md](references/setup.md).
Referenced artifact was not completely inspected
For installation, configuration, and container setup, see [references/setup.md](references/setup.md).
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).
- **Network-exposed** — predictalot is a plain HTTP + MCP service; anyone who can reach the port can call it. Set `PREDICTALOT_AUTH_TOKENS` to a strong generated secret (`$(openssl rand -hex 32)`) and bind to loopback (`-p 127.0.0.1:8080:8080`) by default. Only expose beyond loopback behind a reverse proxy / VPN, and never with the default/example token.
- **External transmission** — every forecast/train call sends your time series, engineered feature values, and/or `modelId`s to whatever `PREDICTALOT_URL` points at — that data leaves your host. Point it only at a service you run or explicitly trust; prefer HTTPS.
- **Consumer-only** — this skill talks to an instance you already run and trusts. It never provisions, starts, or hardens the server; that's the operator's job (see setup.md).
- **Destructive delete requires confirmation** — `DELETE /v1/tabular/models/{modelId}` permanently removes a trained model and cannot be undone. Only call it against a `modelId` you obtained from a prior `GET /v1/tabular/models` (or a train response) in this session, and get explicit user confirmation before issuing the delete.
## When To Use
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).
- **Network-exposed** — predictalot is a plain HTTP + MCP service; anyone who can reach the port can call it. Set `PREDICTALOT_AUTH_TOKENS` to a strong generated secret (`$(openssl rand -hex 32)`) and bind to loopback (`-p 127.0.0.1:8080:8080`) by default. Only expose beyond loopback behind a reverse proxy / VPN, and never with the default/example token.
- **External transmission** — every forecast/train call sends your time series, engineered feature values, and/or `modelId`s to whatever `PREDICTALOT_URL` points at — that data leaves your host. Point it only at a service you run or explicitly trust; prefer HTTPS.
- **Consumer-only** — this skill talks to an instance you already run and trusts. It never provisions, starts, or hardens the server; that's the operator's job (see setup.md).
- **Destructive delete requires confirmation** — `DELETE /v1/tabular/models/{modelId}` permanently removes a trained model and cannot be undone. Only call it against a `modelId` you obtained from a prior `GET /v1/tabular/models` (or a train response) in this session, and get explicit user confirmation before issuing the delete.
## When To Use
Referenced artifact was not completely inspected
For a driver that runs a univariate forecast and pretty-prints the interval, see [`scripts/predictalot.sh`](scripts/predictalot.sh):
Referenced artifact was not completely inspected
For a driver that runs a univariate forecast and pretty-prints the interval, see [`scripts/predictalot.sh`](scripts/predictalot.sh):
This skill is explicitly designed to send user-supplied time series, engineered features, and model identifiers over HTTP(S) to a configured remote service. Even though the documentation warns about this behavior, it still creates a real data exfiltration channel if PREDICTALOT_URL is misconfigured, points to an untrusted host, or uses plaintext HTTP where traffic can be intercepted.
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" | jq
# Zero-shot univariate forecast: 5 steps ahead of one series, chronos-2.
curl -s $PREDICTALOT_URL/v1/timeseries/univariate/forecast \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
The MCP examples show authenticated JSON-RPC requests being sent to the remote /mcp endpoint, which can transmit model inputs and operational metadata off-host. Because the MCP surface mirrors forecasting functionality, it provides another path for sensitive data transmission and expands exposure if the endpoint is reachable by or redirected to an untrusted service.
# tools/list — enumerate every (type, model) tool + ensembles + listings.
curl -s $PREDICTALOT_URL/mcp/ \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
This forecast example transmits raw time-series context to the configured remote service. In the context of an agent skill, that means user-provided proprietary or sensitive data may leave the host environment, so this is a genuine external-transmission risk even if it is core functionality.
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" | jq -r '.models[].slug'
# 2. Forecast with chronos-2 (default all-rounder), 12 steps, three bands.
curl -s $PREDICTALOT_URL/v1/timeseries/univariate/forecast \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"chronos-2","context":[[100,102,101,105,110,108,112,115,120,118,125,130]],
The ensemble forecast example sends the same potentially sensitive context data to a network service, with additional configuration and model-selection metadata. This broadens the amount of information disclosed and remains dangerous if the endpoint is not strictly controlled.
curl -s $PREDICTALOT_URL/v1/timeseries/univariate/forecast/ensemble \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"context":[[100,102,101,105,110,108,112,115,120,118,125,130]],
This endpoint transmits both target series and future covariates, which may include sensitive planned business actions such as promotions or pricing schedules. Leakage of such data to an unintended service or over plaintext HTTP could expose confidential operational plans.
# Target has 8 steps of history; horizon 4 → futureCovariates arrays length 4.
curl -s $PREDICTALOT_URL/v1/timeseries/covariates/future/forecast \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"chronos-2",
The samples forecast example sends historical series to a remote model endpoint and retrieves probabilistic sample paths. While expected for the feature, it still constitutes off-host transmission of potentially proprietary data and can expose sensitive patterns if the service or network path is untrusted.
curl -s $PREDICTALOT_URL/v1/timeseries/samples/forecast \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"toto-1",
The training example sends engineered features, targets, and a caller-chosen model identifier to the remote service for persistence. This is a real privacy and confidentiality risk because training data is often richer and more sensitive than inference inputs, and it is stored server-side after transmission.
# 1. Train on engineered features (you supply them).
curl -s $PREDICTALOT_URL/v1/tabular/train \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"modelId":"trend-3","backend":"lightgbm",
This forecast call sends current engineered features and a model identifier to the remote service. Although less sensitive than full training uploads, it still exposes potentially proprietary signals and can reveal model usage patterns if transmitted to an untrusted or intercepted endpoint.
"config":{"mode":"direction","horizon":3,"nEstimators":400}}' | jq
# 2. Forecast — LAST feature row is the anchor.
curl -s $PREDICTALOT_URL/v1/tabular/forecast \
-H "Authorization: Bearer $PREDICTALOT_AUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"modelId":"trend-3","features":[{"rsi":[72],"mom":[0.8]}]}' | jq
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Using docker pull psyb0t/predictalot:latest relies on a mutable tag, so the content retrieved can change over time without notice. That weakens reproducibility and creates supply-chain risk: if the upstream image is replaced, compromised, or unexpectedly updated, users may deploy unreviewed code.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
auth=(-H "Authorization: Bearer ${PREDICTALOT_AUTH_TOKEN}")
fi
resp="$(curl -sS -w $'\n%{http_code}' \
"${PREDICTALOT_URL}/v1/timeseries/univariate/forecast" \
"${auth[@]}" \
-H "Content-Type: application/json" \