T09 · Insecure Skill Coding Practices
- Location
scripts/login.py:68- Finding
Access Token and One-Time Verification Code Exposed Through Process Arguments and Console Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill matches an AI media-generation purpose, but it handles account tokens and uploaded local media in ways users should review carefully before installing.
Install only if you trust the Neodomain service and are comfortable with prompts, reference URLs, selected local media, and generated outputs being sent through its API/OSS workflow. Avoid putting tokens directly in commands or shell startup files, treat printed tokens as sensitive, and do not upload private media unless you understand where it will be stored and how it can be removed.
scripts/login.py:68Access Token and One-Time Verification Code Exposed Through Process Arguments and Console Output
scripts/upload_oss.py:57Uploaded Media Is Assigned a Low-Entropy Object Name and Returned Through a Direct OSS URL Without Cleanup Controls
scripts/generate_video.py:82Unvalidated Server-Supplied URLs Are Fetched From the Local Execution Environment
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The documented behavior includes access to local files and cloud/object-storage upload flows that are not apparent from the high-level skill purpose. Hidden or under-disclosed file exfiltration paths are dangerous because user-supplied files or local data could be transmitted to third-party storage without adequate user understanding or policy restriction.
The skill instructs the agent to dynamically ask for a user's phone number or email to obtain an access token, introducing direct collection of sensitive identifiers and an authentication workflow inside the skill. In agent contexts, this is dangerous because it can normalize credential/PII solicitation and create opportunities for phishing, mishandling of verification codes, or unauthorized account access.
重要: 每次 token 过期或首次使用时,动态询问用户登录账号(手机号/邮箱),不要硬编码保存。
If you need to obtain an access token:
# 1. 发送验证码 (询问用户手机号或邮箱)
The login workflow states that the script will output an access token that can then be stored for future use. Emitting bearer tokens in plaintext to the terminal or agent output creates a significant exposure risk because logs, transcripts, or other tools may capture and reuse the credential.
python3 {baseDir}/scripts/login.py --login --contact "用户手机号或邮箱" --code "验证码"
The login script will output an access token that you can store in `NEODOMAIN_ACCESS_TOKEN`.
## Workflow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""
Neodomain AI - Authentication Script
Send verification code and login to get access token.
"""
import argparse
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""
Neodomain AI - Authentication Script
Send verification code and login to get access token.
"""
import argparse
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""
Neodomain AI - Authentication Script
Send verification code and login to get access token.
"""
import argparse
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""
Neodomain AI - Authentication Script
Send verification code and login to get access token.
"""
import argparse
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
#!/usr/bin/env python3
"""
Neodomain AI - Authentication Script
Send verification code and login to get access token.
"""
import argparse
The script prints the access token and an export command containing the token directly to stdout. In an agent or automation context, stdout may be captured by logs, chat transcripts, shell history, telemetry, or other tools, causing credential disclosure and enabling unauthorized reuse of the bearer token.
result = login(args.contact, args.code, args.invitation_code)
print("\n✅ Login successful!")
print(f"\nAccess Token:")
print(result.get("authorization"))
print(f"\nUser Info:")
print(f" User ID: {result.get('userId')}")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
parser = argparse.ArgumentParser(description="Get available video generation models")
parser.add_argument("--request-type", type=int, default=2,
help="Request type: 1-视频工具, 2-画布")
parser.add_argument("--token", "--access-token", dest="token", help="Access token")
args = parser.parse_args()