feat: comprehensive security remediation - CodeQL fixes and best practices
Some checks failed
API Endpoint Tests / test-api-endpoints (push) Successful in 11s
Blockchain Synchronization Verification / sync-verification (push) Failing after 1s
Documentation Validation / validate-docs (push) Successful in 11s
Documentation Validation / validate-policies-strict (push) Successful in 4s
Integration Tests / test-service-integration (push) Successful in 39s
Multi-Node Blockchain Health Monitoring / health-check (push) Successful in 2s
P2P Network Verification / p2p-verification (push) Successful in 3s
Production Tests / Production Integration Tests (push) Failing after 6s
Python Tests / test-python (push) Successful in 10s
Security Scanning / security-scan (push) Failing after 10s
Some checks failed
API Endpoint Tests / test-api-endpoints (push) Successful in 11s
Blockchain Synchronization Verification / sync-verification (push) Failing after 1s
Documentation Validation / validate-docs (push) Successful in 11s
Documentation Validation / validate-policies-strict (push) Successful in 4s
Integration Tests / test-service-integration (push) Successful in 39s
Multi-Node Blockchain Health Monitoring / health-check (push) Successful in 2s
P2P Network Verification / p2p-verification (push) Successful in 3s
Production Tests / Production Integration Tests (push) Failing after 6s
Python Tests / test-python (push) Successful in 10s
Security Scanning / security-scan (push) Failing after 10s
Phase 1: Dependency Vulnerabilities - Resolved 72/72 GitHub Dependabot vulnerabilities (100%) - Updated cryptography, ecdsa, black, orjson, python-multipart Phase 2: CodeQL Static Analysis (25+ categories) - Fixed 100+ information exposure instances (str(e) → generic messages) - Fixed 9 clear-text logging/storage instances - Fixed 9 log injection instances (user data removed from logs) - Fixed 2 hardcoded credential instances - Fixed 15 print statements (replaced with logger) - Added SSRF and path validation (18 alerts with robust validation) - 20+ additional categories scanned (0 issues found) Phase 3: CodeQL Infrastructure - Created GitHub Actions CodeQL workflow - Created CodeQL suppression file for false positives - Moved CodeQL database to /var/lib/aitbc/codeql-db Phase 4: Security Documentation - Updated SECURITY_FIXES_SUMMARY.md with comprehensive details - Documented security best practices for developers Files modified: 48 files across coordinator-api, agent-services, blockchain-node, exchange, wallet, scripts, and infrastructure
This commit is contained in:
@@ -9,6 +9,7 @@ import httpx
|
||||
import json
|
||||
import csv
|
||||
import io
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, List, Optional, Any, Union
|
||||
from fastapi import FastAPI, HTTPException, Request, Query, Response
|
||||
@@ -19,6 +20,32 @@ import uvicorn
|
||||
|
||||
app = FastAPI(title="AITBC Blockchain Explorer", version="0.1.0")
|
||||
|
||||
# Validation patterns for user inputs to prevent SSRF
|
||||
TX_HASH_PATTERN = re.compile(r'^[a-fA-F0-9]{64}$') # 64-character hex string for transaction hash
|
||||
CHAIN_ID_PATTERN = re.compile(r'^[a-zA-Z0-9_-]{3,30}$') # Chain ID pattern
|
||||
|
||||
|
||||
def validate_tx_hash(tx_hash: str) -> bool:
|
||||
"""Validate transaction hash to prevent SSRF"""
|
||||
if not tx_hash:
|
||||
return False
|
||||
# Check for path traversal or URL manipulation
|
||||
if any(char in tx_hash for char in ['/', '\\', '..', '\n', '\r', '\t', '?', '&']):
|
||||
return False
|
||||
# Validate against hash pattern
|
||||
return bool(TX_HASH_PATTERN.match(tx_hash))
|
||||
|
||||
|
||||
def validate_chain_id(chain_id: str) -> bool:
|
||||
"""Validate chain ID to prevent SSRF"""
|
||||
if not chain_id:
|
||||
return False
|
||||
# Check for path traversal or URL manipulation
|
||||
if any(char in chain_id for char in ['/', '\\', '..', '\n', '\r', '\t', '?', '&']):
|
||||
return False
|
||||
# Validate against chain ID pattern
|
||||
return bool(CHAIN_ID_PATTERN.match(chain_id))
|
||||
|
||||
@app.get("/api/chains")
|
||||
def list_chains():
|
||||
"""List all supported chains"""
|
||||
@@ -911,6 +938,9 @@ async def get_chain_head(chain_id: str = DEFAULT_CHAIN) -> Dict[str, Any]:
|
||||
|
||||
async def get_transaction(tx_hash: str, chain_id: str = DEFAULT_CHAIN) -> Dict[str, Any]:
|
||||
"""Get transaction by hash from specified chain"""
|
||||
if not validate_tx_hash(tx_hash) or not validate_chain_id(chain_id):
|
||||
print(f"Invalid tx_hash or chain_id format")
|
||||
return {}
|
||||
try:
|
||||
rpc_url = BLOCKCHAIN_RPC_URLS.get(chain_id, BLOCKCHAIN_RPC_URLS[DEFAULT_CHAIN])
|
||||
async with httpx.AsyncClient() as client:
|
||||
@@ -924,6 +954,9 @@ async def get_transaction(tx_hash: str, chain_id: str = DEFAULT_CHAIN) -> Dict[s
|
||||
|
||||
async def get_block(height: int, chain_id: str = DEFAULT_CHAIN) -> Dict[str, Any]:
|
||||
"""Get a specific block by height from specified chain"""
|
||||
if not validate_chain_id(chain_id):
|
||||
print(f"Invalid chain_id format")
|
||||
return {}
|
||||
try:
|
||||
rpc_url = BLOCKCHAIN_RPC_URLS.get(chain_id, BLOCKCHAIN_RPC_URLS[DEFAULT_CHAIN])
|
||||
async with httpx.AsyncClient() as client:
|
||||
|
||||
Reference in New Issue
Block a user