assessmentData = [
{
category: "Device Security",
icon: "🔐",
weight: 1.5,
questions: [
{
q: "Are default passwords changed on all devices?",
options: ["All devices", "Most devices", "Some devices", "No/Unknown"],
scores: [10, 6, 3, 0],
tip: "Default passwords are the #1 IoT vulnerability (Mirai exploited this)"
},
{
q: "Do devices receive regular firmware updates?",
options: ["Auto-update enabled", "Manual but regular", "Occasionally", "Never/Can't update"],
scores: [10, 7, 3, 0],
tip: "Unpatched devices remain vulnerable to known exploits indefinitely"
},
{
q: "Is secure boot enabled on devices?",
options: ["Yes, verified", "Partially", "No", "Unknown"],
scores: [10, 5, 0, 2],
tip: "Secure boot prevents unauthorized firmware from running"
}
]
},
{
category: "Network Security",
icon: "🌐",
weight: 1.3,
questions: [
{
q: "Are IoT devices on a separate network segment/VLAN?",
options: ["Dedicated IoT VLAN", "Some segmentation", "Same as other devices", "Unknown"],
scores: [10, 6, 1, 2],
tip: "Network segmentation limits lateral movement if one device is compromised"
},
{
q: "Is network traffic encrypted (TLS/DTLS)?",
options: ["All traffic encrypted", "Most traffic", "Some traffic", "Unencrypted"],
scores: [10, 6, 3, 0],
tip: "Unencrypted traffic can be intercepted and read by attackers"
},
{
q: "Is there a firewall controlling IoT traffic?",
options: ["Dedicated firewall rules", "General firewall", "Router only", "None"],
scores: [10, 6, 3, 0],
tip: "Firewalls can block unauthorized connections to/from IoT devices"
}
]
},
{
category: "Authentication & Access",
icon: "🔑",
weight: 1.4,
questions: [
{
q: "Is multi-factor authentication used for admin access?",
options: ["MFA required", "MFA available", "Password only", "No authentication"],
scores: [10, 6, 2, 0],
tip: "MFA prevents unauthorized access even if passwords are compromised"
},
{
q: "Are device certificates used for authentication?",
options: ["PKI with certificates", "Shared secrets", "API keys only", "None"],
scores: [10, 6, 3, 0],
tip: "Certificate-based auth is stronger than shared secrets"
},
{
q: "Is there role-based access control (RBAC)?",
options: ["Fine-grained RBAC", "Basic roles", "All-or-nothing", "Unknown"],
scores: [10, 6, 2, 2],
tip: "RBAC limits damage from compromised accounts"
}
]
},
{
category: "Data Protection",
icon: "🛡️",
weight: 1.2,
questions: [
{
q: "Is sensitive data encrypted at rest?",
options: ["AES-256 or equivalent", "Some encryption", "No encryption", "Unknown"],
scores: [10, 5, 0, 2],
tip: "Encryption at rest protects data if storage is compromised"
},
{
q: "Are data retention policies implemented?",
options: ["Automated policies", "Manual deletion", "Data kept indefinitely", "Unknown"],
scores: [10, 6, 1, 2],
tip: "Retaining unnecessary data increases breach impact"
},
{
q: "Is personal data anonymized/pseudonymized?",
options: ["Full anonymization", "Pseudonymized", "Raw PII stored", "No personal data"],
scores: [8, 6, 0, 10],
tip: "Anonymization reduces privacy breach severity"
}
]
},
{
category: "Monitoring & Detection",
icon: "👁️",
weight: 1.1,
questions: [
{
q: "Is there logging of security events?",
options: ["Centralized SIEM", "Local logs", "Minimal logging", "No logging"],
scores: [10, 6, 2, 0],
tip: "Without logs, you can't detect or investigate breaches"
},
{
q: "Is there intrusion detection (IDS/IPS)?",
options: ["Active IDS/IPS", "Passive monitoring", "None", "Unknown"],
scores: [10, 6, 0, 2],
tip: "IDS can detect attacks in progress"
},
{
q: "Are there alerts for anomalous behavior?",
options: ["ML-based anomaly detection", "Threshold alerts", "Manual review", "None"],
scores: [10, 7, 3, 0],
tip: "Automated alerts enable faster incident response"
}
]
},
{
category: "Physical Security",
icon: "🏢",
weight: 0.9,
questions: [
{
q: "Are devices physically secured from tampering?",
options: ["Tamper-evident/resistant", "Locked enclosures", "Basic housing", "Exposed"],
scores: [10, 7, 4, 0],
tip: "Physical access can enable firmware extraction and debug port attacks"
},
{
q: "Are debug ports (JTAG/UART) disabled?",
options: ["Disabled in production", "Password protected", "Enabled", "Unknown"],
scores: [10, 6, 0, 2],
tip: "Debug ports are common attack vectors for firmware extraction"
}
]
},
{
category: "Incident Response",
icon: "🚨",
weight: 1.0,
questions: [
{
q: "Is there a documented incident response plan?",
options: ["Tested IR plan", "Documented plan", "Informal process", "None"],
scores: [10, 7, 3, 0],
tip: "Plans reduce response time and improve breach containment"
},
{
q: "Can compromised devices be remotely isolated?",
options: ["Automated isolation", "Manual capability", "Requires physical access", "Cannot isolate"],
scores: [10, 6, 2, 0],
tip: "Quick isolation prevents lateral movement and data exfiltration"
}
]
},
{
category: "Vendor & Supply Chain",
icon: "📦",
weight: 0.8,
questions: [
{
q: "Are device vendors' security practices assessed?",
options: ["Formal assessment", "Basic review", "Trust vendor", "No assessment"],
scores: [10, 6, 2, 0],
tip: "Vendor vulnerabilities become your vulnerabilities"
},
{
q: "Is there a software bill of materials (SBOM)?",
options: ["Complete SBOM", "Partial inventory", "None", "Unknown"],
scores: [10, 5, 0, 2],
tip: "SBOMs help identify vulnerable components quickly"
}
]
}
]
// Create answer state
mutable answers = Object.fromEntries(
assessmentData.flatMap((cat, ci) =>
cat.questions.map((_, qi) => [`q_${ci}_${qi}`, null])
)
)
// Global function to update answers (needed for onclick handlers in OJS)
window.updateSecurityAnswer = (ci, qi, oi) => {
const event = new CustomEvent('security-answer-update', { detail: { ci, qi, oi } });
document.dispatchEvent(event);
};