T09 · Insecure Skill Coding Practices
- Location
scripts/vikunja.py:58- Finding
Vikunja Credentials and Bearer Tokens May Be Transmitted over Plaintext HTTP
- Content
View full analysis
Vulnerability Details
File Location:
scripts/vikunja.py:58-61; insecure configuration example atSKILL.md:34-40
Vulnerability Type: Cleartext transmission of sensitive information
Risk Level: HighVulnerable code:
python import requests url = f"{cfg['base_url']}/api/v1/login" resp = requests.post(url, json={"username": cfg["username"], "password": cfg["password"]})Insecure documented configuration:
yaml base_url: "http://192.168.1.230:3456" username: "admin" password: "admin123"Technical Analysis
Authentication against the user-configured Vikunja instance is necessary for the Skill's declared functionality. The destination is not hardcoded to an unrelated third party, so this behavior is not evidence of intentional credential exfiltration.
However, the script accepts an
http://base URL without rejection or warning, and the primary configuration example explicitly demonstrates plaintext HTTP. When HTTP is used, the login request sends the username and password without transport encryption. Subsequent API requests also expose bearer tokens, task contents, and modification or deletion requests to network interception and tampering.The
requestslibrary validates certificates when HTTPS is used, but the code does not require HTTPS or distinguish a secure production configuration from an explicit local-development exception.Attack Path
- A user follows the documented example and configures an
http://Vikunja URL. - The user or Agent invokes any command requiring authentication.
- The script sends the username and password in a JSON body over plaintext HTTP.
- An attacker positioned on the same network, a compromised router, or another network intermediary captures or alters the request.
- The attacker authenticates with the captured credentials or replays a captured bearer token.
- The attacker reads, creates, updates, completes, labels, or ...[truncated 593 chars]
- A user follows the documented example and configures an
- Remediation
View remediation
Remediation Suggestions
- Reject base URLs using plaintext HTTP by default:
python from urllib.parse import urlparse parsed = urlparse(cfg["base_url"]) if parsed.scheme != "https": raise ValueError("VIKUNJA_BASE_URL must use HTTPS") - If local development must support HTTP, require an explicit option such as
VIKUNJA_ALLOW_INSECURE_HTTP=1and display a prominent warning. - Limit any exception to loopback addresses where practical; do not silently allow HTTP for arbitrary LAN or Internet hosts.
- Replace the documented HTTP example with an HTTPS URL.
- Replace realistic credentials such as
adminandadmin123with unmistakable placeholders. - Document trusted TLS certificate deployment for self-hosted instances. Do not recommend disabling certificate verification.
- Consider validating that the configured URL contains no embedded user information and normalizing it before endpoint construction.
- Reject base URLs using plaintext HTTP by default:
