T09 · Insecure Skill Coding Practices
- Location
scripts/post.py:36- Finding
Hardcoded Postiz Account Credentials
- Content
View full analysis
Vulnerability Details
File Location:
scripts/post.py:36-41,scripts/check_duplicates.py:22-28, andSKILL.md:49-54
Vulnerability Type: Hardcoded plaintext credentials
Risk Level: HighVulnerable Code
scripts/post.py:36-41:python CREDENTIALS = { "email": "sascha@mykuhlmann.com", "password": "Postiz2026!", "provider": "LOCAL" }scripts/check_duplicates.py:22-28:python POSTIZ_URL = "https://postiz.home.mykuhlmann.com" COOKIE_FILE = "/tmp/postiz-cookies.txt" CREDENTIALS = { "email": "sascha@mykuhlmann.com", "password": "Postiz2026!", "provider": "LOCAL" }SKILL.md:49-54:bash # Login and save cookie (required before any API call) curl -s -c /tmp/postiz-cookies.txt \ 'https://postiz.home.mykuhlmann.com/api/auth/login' \ -H 'Content-Type: application/json' \ -d '{"email":"sascha@mykuhlmann.com","password":"Postiz2026!","provider":"LOCAL"}'Technical Analysis
A Postiz account email address and password are embedded directly in executable source files and published in the Skill documentation. Secrets stored this way become available to anyone who can download, inspect, clone, archive, or otherwise access the project.
Both scripts automatically submit these credentials to the Postiz authentication endpoint when an existing session receives an HTTP 401 response. The authenticated session is subsequently used to list integrations, retrieve posts, upload media, and create social-media posts. Therefore, disclosure is not limited to an inactive configuration value; the credential is directly connected to privileged application functionality.
Attack Path
- An attacker obtains a copy of the Skill or reads its source code.
- The attacker extracts the plaintext email address and password.
- The attacker submits the credentials to
https://postiz.home.mykuhlmann.com/api/auth/login. - The server retur ...[truncated 1060 chars]
- Remediation
View remediation
Remediation Suggestions
-
Immediately rotate the exposed Postiz password and revoke all active sessions created with the old credential.
-
Review Postiz audit records for unauthorized logins, uploads, drafts, scheduled posts, or publications.
-
Remove the credential from all scripts, documentation, repository history, release archives, and distributed Skill packages.
-
Read authentication material from protected environment variables or an operating-system credential store instead:
python import os email = os.environ["POSTIZ_EMAIL"] password = os.environ["POSTIZ_PASSWORD"] credentials = { "email": email, "password": password, "provider": "LOCAL", } -
Fail closed with a clear error when required secret values are absent; do not include fallback passwords.
-
Prefer a dedicated, revocable, least-privilege API token over a reusable account password if Postiz supports token authentication.
-
Use a dedicated automation account whose permissions and connected integrations are limited to the required posting workflow.
-
Add automated secret scanning to version-control and release pipelines.
-
