| Crates.io | solsec |
| lib.rs | solsec |
| version | 0.2.1 |
| created_at | 2025-06-22 19:37:40.165319+00 |
| updated_at | 2025-06-30 12:12:20.495598+00 |
| description | Solana Smart Contract Security Toolkit - Find security bugs before deployment |
| homepage | |
| repository | https://github.com/hasip-timurtas/solsec |
| max_upload_size | |
| id | 1721876 |
| size | 1,169,978 |
A comprehensive security analysis tool for Solana smart contracts that helps developers identify vulnerabilities before deployment through static analysis and fuzz testing. Features an advanced interactive HTML reporting system with intelligent suggestion algorithms.
solsec is designed to be a developer's first line of defense against smart contract vulnerabilities. While other tools exist, solsec offers a unique combination of:
rayon for significant performance improvementrayon cratecargo install solsec
git clone https://github.com/hasip-timurtas/solsec.git
cd solsec
cargo install --path .
# Scan the current project and generates both JSON and HTML
solsec scan
# Scan a specific Solana program and set an output directory
solsec scan ./my-solana-program --output ./results
# Generate only JSON
solsec scan ./my-program --json-only --output results.json
# Generate only HTML
solsec scan ./my-program --html-only --output results.html
# Generate multiple formats at once
solsec scan ./my-program --format json,html,markdown,csv
# Don't open browser automatically
solsec scan ./my-program --no-open
# Run fuzz testing
solsec fuzz ./my-solana-program --timeout 300
solsec scanRun static analysis on your Solana smart contracts. Generates both JSON and HTML by default. If no path is provided, it recursively scans the current directory for all .rs files, automatically ignoring target/ and .git/ folders.
HTML reports automatically open in the default browser when running interactively, but remain closed in CI/automation environments.
solsec scan [PATH] [OPTIONS]
OPTIONS:
-c, --config <FILE> Configuration file path
-o, --output <DIR> Output directory [default: ./solsec-results]
-f, --format <FORMATS> Output formats (comma-separated) [default: json,html] [possible values: json, html, markdown, csv]
--json-only Only generate JSON
--html-only Only generate HTML
--no-open Don't automatically open HTML report in browser
--fail-on-critical Exit with non-zero code on critical issues [default: true]
EXAMPLES:
# Scan the entire project (generates both JSON and HTML)
solsec scan
# Scan a specific directory with default formats
solsec scan ./programs/my-program
# Generate only JSON for CI/CD integration
solsec scan ./programs --json-only --output results.json
# Generate only HTML for manual review
solsec scan ./programs --html-only --output results.html
# Generate HTML but don't open browser
solsec scan ./programs --html-only --no-open --output results.html
# Generate all available formats
solsec scan ./programs --format json,html,markdown,csv
# Scan with configuration file
solsec scan ./programs --config solsec.toml --output ./security-results
solsec fuzzRun fuzz testing on smart contracts.
solsec fuzz <PATH> [OPTIONS]
OPTIONS:
-t, --timeout <SECONDS> Timeout in seconds [default: 300]
-j, --jobs <NUMBER> Number of parallel fuzzing jobs [default: 1]
-o, --output <DIR> Output directory [default: ./fuzz-results]
EXAMPLES:
solsec fuzz ./programs/my-program --timeout 600 --jobs 4
solsec fuzz ./programs --output ./custom-fuzz-results
solsec pluginManage security rule plugins.
solsec plugin <ACTION> [PATH]
ACTIONS:
list List available plugins
load Load a plugin
unload Unload a plugin
EXAMPLES:
solsec plugin list
solsec plugin load ./my-custom-rule.so
solsec plugin unload my-custom-rule
Create a solsec.toml configuration file:
# Enable/disable specific rules
enabled_rules = [
"integer_overflow",
"missing_signer_check",
"unchecked_account",
"reentrancy"
]
disabled_rules = []
# Rule-specific settings
[rule_settings]
[rule_settings.integer_overflow]
ignore_patterns = ["test_*", "mock_*"]
[rule_settings.missing_signer_check]
required_for_instructions = ["transfer", "withdraw"]
| Rule | Severity | Description | Detections |
|---|---|---|---|
reentrancy |
High | Detects state changes after external calls (CEI pattern violations) | โ 8 vulnerabilities found |
unchecked_account |
Critical | Finds unsafe account access, transmute operations, and unvalidated accounts | โ 4 critical + 14 medium issues |
missing_signer_check |
High | Identifies instruction handlers without proper signer validation | โ 8 high severity issues |
integer_overflow |
Medium | Detects arithmetic operations without overflow protection | โ 5 legitimate overflow risks |
pda_validation |
High | Validates PDA derivation and bump parameter usage | โ PDA validation |
privilege_escalation |
Critical | Detects unauthorized authority/admin changes | โ Authority security |
unsafe_arithmetic |
Medium | Finds division by zero and underflow risks | โ Arithmetic protection |
insufficient_validation |
High | Identifies missing input validation in public functions | โ Input validation |
๐ For detailed information about each security check, including code examples and best practices, see the Security Checks Reference.
Create custom security rules by implementing the Rule trait:
use solsec::plugin::{Rule, RuleResult, Severity};
use std::path::Path;
use anyhow::Result;
#[derive(Debug)]
pub struct MyCustomRule;
impl Rule for MyCustomRule {
fn name(&self) -> &str {
"my_custom_rule"
}
fn description(&self) -> &str {
"Detects my specific vulnerability pattern"
}
fn check(&self, content: &str, file_path: &Path) -> Result<Vec<RuleResult>> {
let mut results = Vec::new();
// Your analysis logic here
for (line_num, line) in content.lines().enumerate() {
if line.contains("dangerous_pattern") {
results.push(RuleResult {
severity: Severity::High,
message: "Dangerous pattern detected".to_string(),
line_number: Some(line_num + 1),
column: None,
code_snippet: Some(line.trim().to_string()),
suggestion: Some("Use safe alternative".to_string()),
});
}
}
Ok(results)
}
}
// Plugin interface
#[no_mangle]
pub extern "C" fn get_plugin_info() -> PluginInfo {
PluginInfo {
name: "my_plugin".to_string(),
version: "1.0.0".to_string(),
description: "My custom security plugin".to_string(),
author: "Your Name".to_string(),
rules: vec!["my_custom_rule".to_string()],
}
}
#[no_mangle]
pub extern "C" fn create_rules() -> Vec<Box<dyn Rule>> {
vec![Box::new(MyCustomRule)]
}
Build your plugin as a dynamic library:
cargo build --lib --crate-type=cdylib --release
Add the following to your .github/workflows/security.yml:
name: Security Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install solsec
run: |
cargo install --locked solsec
- name: Run security scan
run: |
solsec scan ./programs --output ./security-results
- name: Upload security report
uses: actions/upload-artifact@v3
with:
name: security-report
path: ./security-results/
- name: Fail on critical issues
run: |
if [ -f ./security-results/*.json ]; then
# Ensure jq is installed
sudo apt-get install -y jq
critical_count=$(jq '.summary.critical_issues' ./security-results/*.json)
if [ "$critical_count" -gt 0 ]; then
echo "โ Critical security issues found: $critical_count"
exit 1
fi
fi
Block commits that introduce critical vulnerabilities.
Setup Instructions:
.git/hooks/pre-commitchmod +x .git/hooks/pre-commit#!/bin/sh
# .git/hooks/pre-commit
echo "๐ก๏ธ Running security scan..."
# Ensure solsec is in your PATH
if ! command -v solsec &> /dev/null; then
echo "solsec could not be found, skipping pre-commit check."
exit 0
fi
# Create a temporary directory for results
RESULTS_DIR=$(mktemp -d)
solsec scan ./programs --format json --output "$RESULTS_DIR" --no-open
if [ -f "$RESULTS_DIR"/*.json ]; then
# Ensure jq is installed
if ! command -v jq &> /dev/null; then
echo "jq could not be found, skipping severity check."
rm -rf "$RESULTS_DIR"
exit 0
fi
critical_count=$(jq '.summary.critical_issues' "$RESULTS_DIR"/*.json 2>/dev/null || echo "0")
if [ "$critical_count" -gt 0 ]; then
echo "โ Critical security issues found: $critical_count! Commit blocked."
echo "Run 'solsec scan ./programs' to see details."
rm -rf "$RESULTS_DIR"
exit 1
fi
fi
rm -rf "$RESULTS_DIR"
echo "โ
Security scan passed!"
HTML reports automatically open in the default browser under the following conditions:
Opens automatically when:
--html-only or default formats)Remains closed when:
--no-open flagRevolutionary interactive HTML reports with:
๐ Live Example: Check out examples/security-report.html to see a complete security report generated from scanning the example vulnerabilities. This report shows:
Machine-readable format for:
Developer-friendly format for:
git clone https://github.com/hasip-timurtas/solsec.git
cd solsec
cargo build --release
cargo test
We welcome contributions! Please see our comprehensive Contributing Guide for detailed instructions on:
./scripts/run-tests.sh before submissionQuick start for contributors:
./scripts/run-tests.sh to ensure all checks passThe examples/ directory contains comprehensive security vulnerability demonstrations:
Each category includes both vulnerable and secure implementations for educational purposes:
| Vulnerability Type | Severity | Vulnerable Examples | Secure Examples |
|---|---|---|---|
| Integer Overflow | Medium | examples/integer_overflow/vulnerable.rs |
examples/integer_overflow/secure.rs |
| Missing Signer Check | High | examples/missing_signer_check/vulnerable.rs |
examples/missing_signer_check/secure.rs |
| Unchecked Account | Critical | examples/unchecked_account/vulnerable.rs |
examples/unchecked_account/secure.rs |
| Reentrancy | High | examples/reentrancy/vulnerable.rs |
examples/reentrancy/secure.rs |
# Test individual vulnerable examples
solsec scan examples/integer_overflow/vulnerable.rs # 4 medium severity issues
solsec scan examples/missing_signer_check/vulnerable.rs # 4 high severity issues
solsec scan examples/unchecked_account/vulnerable.rs # 4 critical + 4 medium issues
solsec scan examples/reentrancy/vulnerable.rs # 4 high severity issues
# Test secure examples (should find fewer/no critical issues)
solsec scan examples/*/secure.rs # Mainly medium severity issues
# Comprehensive analysis across all examples
solsec scan examples/ # 39 total issues: 4 critical + 16 high + 19 medium
See the detailed examples/README.md for complete documentation.
rayon crate for optimal speedโ
Comprehensive Testing: Full unit test coverage
โ
Code Quality: Passes strict clippy linting (-D warnings)
โ
Formatting: rustfmt compliant
โ
Performance: Parallel processing architecture
โ
Accuracy: High precision vulnerability detection
โ
Coverage: Multi-severity issue identification
| Feature | Status | Details |
|---|---|---|
| Reentrancy Detection | โ Active | Detects 8 types of reentrancy vulnerabilities |
| Critical Account Issues | โ Active | Identifies unsafe account access patterns |
| Interactive Suggestions | โ Active | Multi-option HTML suggestions with code examples |
| Function-Specific Guidance | โ Active | Personalized recommendations using function names |
| False Positive Rate | โ Minimal | Intelligent filtering of non-code patterns |
| Processing Speed | โ Optimized | Parallel processing for fast analysis |
| Security Coverage | โ Comprehensive | 39+ vulnerability patterns detected |
This project is licensed under the MIT License - see the LICENSE file for details.
โ ๏ธ Important: This tool helps identify potential security issues but does not guarantee complete security. Always conduct thorough testing and consider professional security audits for production applications.

Professional HTML security reports with syntax highlighting, interactive navigation, and actionable suggestions
Built with โค๏ธ by Hasip Timurtas