T09 · Insecure Skill Coding Practices
- Location
dashboard.py:43- Finding
Unauthenticated dashboard server binds to all network interfaces
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a simulated trading skill, but it includes under-disclosed unauthenticated dashboard servers exposed beyond localhost.
Review before installing or running. Treat it as a paper-trading/demo tool, not a safe live trading system. Do not expose the dashboard on an untrusted network; bind it to 127.0.0.1, add authentication, and avoid importing dashboard.py unless you intend to start a server. Confirm the Hyperliquid API dependency is acceptable in your environment and do not rely on the mock/simplified indicators for financial decisions.
dashboard.py:43Unauthenticated dashboard server binds to all network interfaces
trading_system_v3.py:89V3 dashboard exposes unauthenticated HTTP endpoints on all interfaces
trading_system_v2.py:26Unvalidated zero market price causes division-by-zero denial of service
Exposing an undeclared HTTP server on 0.0.0.0 while presenting the skill as a trading system materially changes its security profile. In context, this is especially risky because a finance-themed skill may be trusted more readily, and an unexpected network service can leak state, invite probing, or serve as a foothold on the host.
Exposing an undeclared HTTP server on 0.0.0.0 while presenting the skill as a trading system materially changes its security profile. In context, this is especially risky because a finance-themed skill may be trusted more readily, and an unexpected network service can leak state, invite probing, or serve as a foothold on the host.
Exposing an undeclared HTTP server on 0.0.0.0 while presenting the skill as a trading system materially changes its security profile. In context, this is especially risky because a finance-themed skill may be trusted more readily, and an unexpected network service can leak state, invite probing, or serve as a foothold on the host.
Exposing an undeclared HTTP server on 0.0.0.0 while presenting the skill as a trading system materially changes its security profile. In context, this is especially risky because a finance-themed skill may be trusted more readily, and an unexpected network service can leak state, invite probing, or serve as a foothold on the host.
The script performs automated trade execution based solely on internally generated signals and immediately opens positions without any explicit user confirmation, dry-run mode, or safety interlock. In a trading skill context, these are potentially irreversible financial operations that can cause direct monetary loss if the tool is invoked unintentionally, with stale/manipulated data, or under incorrect assumptions about whether it is in simulation versus live mode.
The skill automatically opens positions based on generated signals without any explicit user confirmation, safety interlock, or clear warning that trading actions will occur. In the context of an automated trading system, this materially increases the risk of unintended financial actions and makes the misleading mock-indicator logic more dangerous.
The skill advertises network-relevant behavior and the broader analysis indicates external connectivity or server functionality, but the manifest declares no explicit tool scope or permissions. This is dangerous because it prevents users and hosting platforms from understanding or constraining what the skill may access over the network.
The skill presents automated order placement and risk controls without any prominent warning that it may influence financial decisions or simulate/execute trades. In a trading context, this is dangerous because users may enable automation without understanding loss risk, execution semantics, or whether safeguards are real versus marketing text.
The code makes an outbound request to a third-party trading data API without prominent disclosure to the user, which can surprise users in restricted or privacy-sensitive environments. In an automated trading skill, undisclosed network access is more dangerous because it directly influences trading decisions and can expose usage metadata or fail in ways that silently alter behavior.
This finding highlights the hardcoded external domain used for market-data retrieval. Hardcoded third-party endpoints are not inherently malicious, but in a trading automation tool they increase operational and security risk because users may be unaware of outbound connectivity and the tool has no clear mechanism to verify or substitute the data source if it becomes untrustworthy.
def get_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
coin = symbol.replace("USDT", "")
return float(r.json().get(coin, 0))
This finding highlights the hardcoded external domain used for market-data retrieval. Hardcoded third-party endpoints are not inherently malicious, but in a trading automation tool they increase operational and security risk because users may be unaware of outbound connectivity and the tool has no clear mechanism to verify or substitute the data source if it becomes untrustworthy.
def get_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
coin = symbol.replace("USDT", "")
return float(r.json().get(coin, 0))
This finding highlights the hardcoded external domain used for market-data retrieval. Hardcoded third-party endpoints are not inherently malicious, but in a trading automation tool they increase operational and security risk because users may be unaware of outbound connectivity and the tool has no clear mechanism to verify or substitute the data source if it becomes untrustworthy.
def get_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
coin = symbol.replace("USDT", "")
return float(r.json().get(coin, 0))
The manifest says the skill is an 'Automated Trading System with Multi-Strategy Voting', which implies executing or coordinating trading logic. In this file, the code only starts an HTTP server and returns fixed dashboard/status content, with no trading, voting, market interaction, or live system state retrieval.
The code sends network requests to an external trading API without any user-facing disclosure. While the transmitted data here is minimal, undisclosed outbound connections in an agent skill reduce transparency and can surprise users or violate environment/network expectations.
The docstring claims indicator calculation, but the implementation uses deterministic pseudo-random RSI and MACD values instead of real market-derived indicators. In a trading skill, this is dangerous because it can mislead users into believing decisions are based on legitimate analysis, causing unsafe automated trades and financial loss.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
def get_realtime_price(self, symbol: str) -> float:
try:
r = requests.post("https://api.hyperliquid.xyz/info",
json={"type": "allMids"}, timeout=10)
data = r.json()
coin = symbol.replace("USDT", "").replace("USDC", "")