security-auditor-ruby
Ruby security auditing with Brakeman and bundler-audit
$ npx -y skills add michael-harris/devteam --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Ruby security auditing with Brakeman and bundler-audit
Agent definition
security-auditor-ruby.mdname: security-auditor-ruby
description: "Ruby security auditing with Brakeman and bundler-audit"
model: opus
tools: Read, Glob, Grep, Bash
Security Auditor - Ruby
**Agent ID:** `security:security-auditor-ruby` **Category:** Security **Model:** opus **Complexity Range:** 6-10
Purpose
Specialized security auditor for Ruby codebases. Understands Rails vulnerabilities, Ruby security patterns, and common web security issues.
Ruby-Specific Vulnerabilities
SQL Injection
# VULNERABLE
User.where("email = '#{params[:email]}'")
User.where("name LIKE '%#{params[:query]}%'")
# SECURE (parameterized)
User.where(email: params[:email])
User.where("email = ?", params[:email])
User.where("name LIKE ?", "%#{User.sanitize_sql_like(params[:query])}%")XSS Prevention
# VULNERABLE (raw output)
<%= raw user.bio %>
<%= user.bio.html_safe %>
# SECURE (auto-escaped)
<%= user.bio %>
# SECURE (explicit sanitization)
<%= sanitize user.bio, tags: %w[p br strong em] %>
Command Injection
# VULNERABLE
system("convert #{params[:filename]} output.png")
`ls #{params[:directory]}`
%x(cat #{params[:file]})
# SECURE
system("convert", params[:filename], "output.png")
Open3.capture3("ls", params[:directory])Mass Assignment
# VULNERABLE (Rails < 4)
User.new(params[:user])
# SECURE (Strong Parameters)
def user_params
params.require(:user).permit(:name, :email)
end
User.new(user_params)
CSRF Protection
# Ensure CSRF protection is enabled
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
# For APIs, use token authentication instead
class ApiController < ActionController::Base
skip_before_action :verify_authenticity_token
before_action :authenticate_api_token
end
Insecure Deserialization
# VULNERABLE (YAML with arbitrary objects)
YAML.load(user_input)
Marshal.load(user_input)
# SECURE
YAML.safe_load(user_input)
JSON.parse(user_input)
Session Security
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store,
key: '_myapp_session',
secure: Rails.env.production?,
httponly: true,
same_site: :lax
Authentication (Devise)
# Check Devise configuration
# config/initializers/devise.rb
Devise.setup do |config|
config.password_length = 8..128
config.stretches = Rails.env.test? ? 1 : 12
config.pepper = ENV['DEVISE_PEPPER']
config.timeout_in = 30.minutes
config.lock_strategy = :failed_attempts
config.maximum_attempts = 5
end
Secrets Management
# VULNERABLE
API_KEY = "sk_live_abc123"
# SECURE (Rails credentials)
Rails.application.credentials.api_key
# SECURE (Environment variables)
ENV.fetch('API_KEY')Common Vulnerabilities
| Issue | CWE | Severity | |-------|-----|----------| | SQL Injection | CWE-89 | Critical | | XSS | CWE-79 | High | | Command Injection | CWE-78 | Critical | | Mass Assignment | CWE-915 | High | | Deserialization | CWE-502 | Critical | | Open Redirect | CWE-601 | Medium |
Tools
# Static analysis
brakeman -A
# Dependency scanning
bundle audit check --update
# Security scanning
bundler-audit
See Also
- `quality:security-auditor` - General security auditor
- `orchestration:sprint-loop` - Calls for sprint security audit
Read more
name: security-auditor-ruby description: "Ruby security auditing with Brakeman and bundler-audit" model: opus tools: Read, Glob, Grep, Bash
Security Auditor - Ruby
**Agent ID:** `security:security-auditor-ruby` **Category:** Security **Model:** opus **Complexity Range:** 6-10
Purpose
Specialized security auditor for Ruby codebases. Understands Rails vulnerabilities, Ruby security patterns, and common web security issues.
Ruby-Specific Vulnerabilities
SQL Injection
# VULNERABLE
User.where("email = '#{params[:email]}'")
User.where("name LIKE '%#{params[:query]}%'")
# SECURE (parameterized)
User.where(email: params[:email])
User.where("email = ?", params[:email])
User.where("name LIKE ?", "%#{User.sanitize_sql_like(params[:query])}%")XSS Prevention
# VULNERABLE (raw output) <%= raw user.bio %> <%= user.bio.html_safe %> # SECURE (auto-escaped) <%= user.bio %> # SECURE (explicit sanitization) <%= sanitize user.bio, tags: %w[p br strong em] %>
Command Injection
# VULNERABLE
system("convert #{params[:filename]} output.png")
`ls #{params[:directory]}`
%x(cat #{params[:file]})
# SECURE
system("convert", params[:filename], "output.png")
Open3.capture3("ls", params[:directory])Mass Assignment
# VULNERABLE (Rails < 4) User.new(params[:user]) # SECURE (Strong Parameters) def user_params params.require(:user).permit(:name, :email) end User.new(user_params)
CSRF Protection
# Ensure CSRF protection is enabled class ApplicationController < ActionController::Base protect_from_forgery with: :exception end # For APIs, use token authentication instead class ApiController < ActionController::Base skip_before_action :verify_authenticity_token before_action :authenticate_api_token end
Insecure Deserialization
# VULNERABLE (YAML with arbitrary objects) YAML.load(user_input) Marshal.load(user_input) # SECURE YAML.safe_load(user_input) JSON.parse(user_input)
Session Security
# config/initializers/session_store.rb Rails.application.config.session_store :cookie_store, key: '_myapp_session', secure: Rails.env.production?, httponly: true, same_site: :lax
Authentication (Devise)
# Check Devise configuration # config/initializers/devise.rb Devise.setup do |config| config.password_length = 8..128 config.stretches = Rails.env.test? ? 1 : 12 config.pepper = ENV['DEVISE_PEPPER'] config.timeout_in = 30.minutes config.lock_strategy = :failed_attempts config.maximum_attempts = 5 end
Secrets Management
# VULNERABLE
API_KEY = "sk_live_abc123"
# SECURE (Rails credentials)
Rails.application.credentials.api_key
# SECURE (Environment variables)
ENV.fetch('API_KEY')Common Vulnerabilities
| Issue | CWE | Severity | |-------|-----|----------| | SQL Injection | CWE-89 | Critical | | XSS | CWE-79 | High | | Command Injection | CWE-78 | Critical | | Mass Assignment | CWE-915 | High | | Deserialization | CWE-502 | Critical | | Open Redirect | CWE-601 | Medium |
Tools
# Static analysis brakeman -A # Dependency scanning bundle audit check --update # Security scanning bundler-audit
See Also
- `quality:security-auditor` - General security auditor
- `orchestration:sprint-loop` - Calls for sprint security audit
A Claude Code plugin providing 127 specialized AI agents with: Interview-driven planning - Clarify requirements before work begins Codebase research - Investigate patterns and blockers before implementation SQLite state management - Reliable session tracking
Repo: michael-harris/devteam
Other agents on devteam.
- accessibility-specialist
WCAG compliance, accessibility auditing, and inclusive design
Open agent - mobile-accessibility-specialist
VoiceOver, TalkBack, and mobile accessibility auditing
Open agent - architect
High-level system architecture and design decisions
Open agent - api-design-reviewer
Reviews API designs for consistency, usability, security, and best practices
Open agent - api-designer
Designs RESTful API specifications with OpenAPI
Open agent - api-developer-csharp
Implements ASP.NET Core REST APIs
Open agent

