Security Scanning
Magento Security Scanner
# Built-in security check
bin/magento security:check
# Check for known vulnerabilities
bin/magento module:status
# Verify file integrity
bin/magento setup:verify-checksum
Automated Security Scanning
use Magento\Security\Model\Scanner\File;
class SecurityScanner
{
private $fileScanner;
private $logger;
public function scan()
{
$results = [
'file_permissions' => $this->scanFilePermissions(),
'known_vulnerabilities' => $this->scanVulnerabilities(),
'configuration' => $this->scanConfiguration(),
'dependencies' => $this->scanDependencies(),
];
return $results;
}
private function scanFilePermissions()
{
$issues = [];
$writableDirs = ['var/', 'pub/media/', 'pub/static/', 'app/etc/'];
foreach ($writableDirs as $dir) {
if (!is_writable($dir)) {
$issues[] = "Directory {$dir} is not writable";
}
}
return $issues;
}
}
External Scanning Tools
# OWASP ZAP scan
zap-cli quick-scan -s all -r https://magento.example.com
# Nikto scan
nikto -h https://magento.example.com
# SSL/TLS testing
ssltest https://magento.example.com
Key Points
- Run security scans regularly (weekly/monthly)
- Automate scans in CI/CD pipeline
- Track scan results over time
- Prioritize findings by severity
Vulnerability Assessment
Common Magento Vulnerabilities
// 1. Known Vulnerability Database
$vulnerabilities = [
'CVE-2024-1234' => [
'severity' => 'critical',
'affected' => '< 2.4.6',
'fix' => 'Upgrade to 2.4.6+',
],
'CVE-2024-5678' => [
'severity' => 'high',
'affected' => '2.4.4-2.4.5',
'fix' => 'Apply patch MAGETO-2024-001',
],
];
// 2. Configuration Vulnerabilities
$securityChecks = [
'default_admin_credentials' => $this->checkDefaultCredentials(),
'debug_mode_enabled' => $this->checkDebugMode(),
'exposed_admin_url' => $this->checkAdminUrl(),
'weak_password_policy' => $this->checkPasswordPolicy(),
];
// 3. Code Vulnerabilities
$codeIssues = [
'sql_injection' => $this->scanForSqlInjection(),
'xss_vulnerabilities' => $this->scanForXss(),
'csrf_protection' => $this->checkCsrfProtection(),
'insecure_deserialization' => $this->checkDeserialization(),
];
Risk Assessment Matrix
class RiskAssessment
{
public function assessRisk($likelihood, $impact)
{
// Risk = Likelihood x Impact
$riskScore = $likelihood * $impact;
if ($riskScore >= 20) return 'critical';
if ($riskScore >= 12) return 'high';
if ($riskScore >= 6) return 'medium';
return 'low';
}
public function prioritizeFixes($vulnerabilities)
{
usort($vulnerabilities, function($a, $b) {
return $b['risk_score'] <=> $a['risk_score'];
});
return $vulnerabilities;
}
}
Key Points
- Assess both technical and business risks
- Prioritize based on likelihood and impact
- Document all findings with remediation steps
- Track vulnerability remediation progress
Penetration Testing Basics
Testing Scope
# penetration-test-scope.yml
scope:
targets:
- https://magento.example.com
- https://admin.magento.example.com
- https://api.magento.example.com
allowed_tests:
- Authentication testing
- Authorization testing
- Input validation testing
- Session management testing
excluded_tests:
- Denial of service
- Social engineering
- Physical access
Authentication Testing
// Test for weak passwords
$commonPasswords = [
'admin123', 'password', 'magento123',
'123456', 'qwerty', 'letmein',
];
foreach ($commonPasswords as $password) {
$result = $this->tryLogin('admin', $password);
if ($result->isSuccess()) {
$this->report('Weak admin password found');
}
}
// Test for brute force protection
$attempts = 0;
while ($attempts < 10) {
$result = $this->tryLogin('admin', 'wrong_password');
$attempts++;
if ($result->isRateLimited()) {
$this->report('Brute force protection working');
break;
}
}
Authorization Testing
// Test for privilege escalation
$lowPrivilegeUser = $this->loginAs('editor');
$adminEndpoints = [
'/admin/system/config',
'/admin/user/index',
'/admin/dashboard',
];
foreach ($adminEndpoints as $endpoint) {
$response = $lowPrivilegeUser->get($endpoint);
if ($response->isOk()) {
$this->report('Privilege escalation: ' . $endpoint);
}
}
Key Points
- Get written authorization before testing
- Test in staging environment when possible
- Document all findings with proof
- Provide remediation recommendations
Security Audit Process
Audit Checklist
## Magento Security Audit Checklist
### Authentication & Authorization
- [ ] Default credentials changed
- [ ] Admin URL customized
- [ ] 2FA enabled for admin users
- [ ] Strong password policy enforced
- [ ] Session timeout configured
- [ ] Failed login lockout enabled
### Input Validation
- [ ] All inputs validated server-side
- [ ] SQL injection protection
- [ ] XSS prevention (output escaping)
- [ ] CSRF tokens on all forms
### Configuration Security
- [ ] Debug mode disabled in production
- [ ] Error display disabled
- [ ] File permissions secured
- [ ] Sensitive files protected
### API Security
- [ ] Rate limiting enabled
- [ ] CORS properly configured
- [ ] API tokens expired
- [ ] OAuth 2.0 implemented
Audit Report Template
class AuditReport
{
public function generate($findings)
{
$report = [
'summary' => $this->getSummary($findings),
'critical_findings' => $this->getFindings($findings, 'critical'),
'high_findings' => $this->getFindings($findings, 'high'),
'medium_findings' => $this->getFindings($findings, 'medium'),
'low_findings' => $this->getFindings($findings, 'low'),
'recommendations' => $this->getRecommendations($findings),
];
return $report;
}
}
Key Points
- Conduct audits quarterly or after major changes
- Use standardized checklists
- Track remediation progress
- Maintain audit documentation
Practice Problems
0 / 1 solved
Security Audit Script
Create a script that performs basic security checks on a Magento installation.
Solution
<?php
$checks = [];
// Check file permissions
$writableDirs = ['var/', 'pub/media/', 'pub/static/'];
foreach ($writableDirs as $dir) {
if (!is_writable($dir)) {
$checks[] = ['critical', "$dir is not writable"];
}
}
// Check debug mode
$env = require 'app/etc/env.php';
if (($env['MAGE_MODE'] ?? '') === 'developer') {
$checks[] = ['high', 'Developer mode enabled in production'];
}
// Check default admin URL
$backend = $env['backend']['frontName'] ?? '';
if ($backend === 'admin' || empty($backend)) {
$checks[] = ['high', 'Default admin URL not changed'];
}
// Output
foreach ($checks as $check) {
echo "[{$check[0]}] {$check[1]}\n";
} Quiz
1. What is the first step in a security audit?
2. Which tool scans for known vulnerabilities?
3. What is privilege escalation?
4. How often should security audits be conducted?
Flashcards
Question
Security audit first step?
Click to reveal answer
Answer
Get written authorization before testing
Question
Built-in security scanner?
Click to reveal answer
Answer
bin/magento security:check
Question
Privilege escalation?
Click to reveal answer
Answer
Gaining unauthorized higher access levels
Question
Audit frequency?
Click to reveal answer
Answer
Quarterly and after major changes
Revision Notes
Key Takeaways
- 1. Always get authorization before security testing
- 2. Use built-in and external tools for scanning
- 3. Prioritize findings by risk level
- 4. Document everything with remediation steps
Interview Tips
- • Explain the security audit process
- • Discuss common vulnerability types
- • Know how to prioritize security fixes
Cheat Sheet
Security Audit
- Get authorization
- Scan: bin/magento security:check
- Assess: CVSS scoring
- Test: authentication, authorization
- Report: findings + remediation