T09 · Insecure Skill Coding Practices
- Location
assets/autonomous-cfo/src/connectors/odoo_client.py:84- Finding
Odoo Credentials and Financial Data May Be Transmitted Without Authenticated TLS
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is coherent for read-only Odoo financial reporting, but it handles finance credentials and data while allowing plaintext or unauthenticated TLS connections.
Install only if you will configure a dedicated read-only Odoo API account, use an HTTPS Odoo URL with valid certificate verification, avoid --insecure, and are comfortable with local report files containing sensitive financial data. Review and pin dependencies before production use.
assets/autonomous-cfo/src/connectors/odoo_client.py:84Odoo Credentials and Financial Data May Be Transmitted Without Authenticated TLS
assets/autonomous-cfo/install.sh:16Installation Resolves Mutable and Unhashed Third-Party Dependencies
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
for _ in range(attempts):
try:
resp = requests.post(
url=url,
headers=self._headers(),
json=payload,
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
return "xmlrpc"
try:
resp = requests.get(f"{url}/web/version", timeout=min(args.timeout, 10), verify=not args.insecure)
resp.raise_for_status()
payload = resp.json() if resp.text else {}
version = str(payload.get("version", ""))
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
If the skill exposes raw RPC execution against arbitrary Odoo models and methods plus local config writes without explicit declaration, that materially expands the attack surface beyond the stated read-only reporting purpose. In a finance-connected skill, undeclared generic RPC can enable unauthorized access to sensitive records or invocation of unexpected server-side methods if not strictly constrained.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
./venv/bin/python -c "import requests, matplotlib, PIL, fpdf; print('All dependencies installed')"
# Test connection (requires .env)
if [ -f ".env" ]; then
echo "Testing Odoo connection..."
./venv/bin/python src/tools/cfo_cli.py doctor
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
./venv/bin/python -c "import requests, matplotlib, PIL, fpdf; print('All dependencies installed')"
# Test connection (requires .env)
if [ -f ".env" ]; then
echo "Testing Odoo connection..."
./venv/bin/python src/tools/cfo_cli.py doctor
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
./venv/bin/python -c "import requests, matplotlib, PIL, fpdf; print('All dependencies installed')"
# Test connection (requires .env)
if [ -f ".env" ]; then
echo "Testing Odoo connection..."
./venv/bin/python src/tools/cfo_cli.py doctor
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
./venv/bin/python -c "import requests, matplotlib, PIL, fpdf; print('All dependencies installed')"
# Test connection (requires .env)
if [ -f ".env" ]; then
echo "Testing Odoo connection..."
./venv/bin/python src/tools/cfo_cli.py doctor
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
./venv/bin/python -c "import requests, matplotlib, PIL, fpdf; print('All dependencies installed')"
# Test connection (requires .env)
if [ -f ".env" ]; then
echo "Testing Odoo connection..."
./venv/bin/python src/tools/cfo_cli.py doctor
else
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env_file(path: Optional[str]) -> None:
"""Lightweight .env loader (no external dependency)."""
if not path:
return
if not os.path.isfile(path):
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env_file(path: Optional[str]) -> None:
"""Lightweight .env loader (no external dependency)."""
if not path:
return
if not os.path.isfile(path):
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env_file(path: Optional[str]) -> None:
"""Lightweight .env loader (no external dependency)."""
if not path:
return
if not os.path.isfile(path):
No suspicious patterns detected.