Risk Assessment

security

Definition

Risk assessment is a systematic, evidence-based process of identifying threats and vulnerabilities, analyzing the likelihood and potential impact of adverse events, and evaluating the resulting risks against acceptance criteria to determine appropriate treatment strategies. In information security, risk assessment provides the analytical foundation for all security decisions -- from prioritizing vulnerability remediation to allocating security budgets, from regulatory compliance to insurance underwriting.

A risk assessment answers three fundamental questions: What can go wrong? How likely is it? How bad would it be? The answers are expressed as risk values that combine likelihood (probability of occurrence) and impact (consequence severity), producing a risk magnitude that can be compared, ranked, and tracked over time. This quantification transforms subjective security concerns into actionable, measurable data that supports rational decision-making.

Modern risk assessment has evolved from periodic, manual exercises (annual risk assessments conducted by consultants) to continuous, automated processes that integrate with real-time threat intelligence, vulnerability scanning, and attack surface monitoring. The Prismatic Platform implements continuous risk assessment through its Perimeter module, which combines asset discovery, vulnerability detection, and evidence-based scoring to produce real-time security ratings for monitored organizations.

Risk Assessment Frameworks

Several industry-standard frameworks provide structured methodologies for conducting risk assessments:

FrameworkOriginFocusApproach
ISO 27005ISO/IECInformation security risk managementProcess-oriented, asset-based
NIST SP 800-30NIST (US)IT risk assessment guideThreat-source/event/vulnerability model
FAIROpen GroupQuantitative risk analysisFinancial impact quantification
OCTAVECMU/SEIOrganizational riskSelf-directed, operationally focused
CRAMMUK CCTAComprehensive risk analysisAsset valuation, countermeasure selection
EBIOSANSSI (France)Threat scenario riskStakeholder-driven, scenario-based

The Prismatic Platform's risk assessment methodology draws primarily from NIST SP 800-30 for its threat taxonomy and ISO 27005 for its process structure, while incorporating FAIR principles for quantitative scoring where sufficient data exists.

The Risk Assessment Process

Risk assessment follows a structured lifecycle that moves from identification through analysis to evaluation:

 Asset Discovery     Threat Identification     Vulnerability Detection
       |                      |                         |
       v                      v                         v
  +---------+          +------------+            +-------------+
  | Assets  |--------->| Threat     |----------->| Risk        |
  | Inventory|         | Scenarios  |            | Analysis    |
  +---------+          +------------+            +-------------+
                                                       |
                                                       v
                                              +----------------+
                                              | Risk Evaluation|
                                              | (Likelihood x  |
                                              |  Impact)       |
                                              +----------------+
                                                       |
                                                       v
                                              +----------------+
                                              | Risk Treatment |
                                              | Decision       |
                                              +----------------+

Phase 1: Context Establishment

Before assessing risks, the scope and criteria must be defined:

ParameterDescriptionExample
ScopeWhat is being assessedOrganization's external attack surface
Risk AppetiteAcceptable risk levelScore above 700 (A-B rating)
Assessment CriteriaHow risks are measuredCVSS for vulnerabilities, EPSS for likelihood
StakeholdersWho consumes the resultsCISO, compliance team, board
Regulatory ContextApplicable regulationsNIS2, ZKB 264/2025 Sb.

Phase 2: Risk Identification

Risk identification discovers what could go wrong by combining asset inventory with threat intelligence:

SourceMethodOutput
Asset DiscoveryDNS enumeration, certificate transparency, port scanningAsset inventory
Vulnerability ScanningCVE detection, misconfiguration checksVulnerability list
Threat IntelligenceOSINT feeds, breach databases, dark web monitoringThreat indicators
Compliance GapsFramework mapping, control assessmentNon-conformities
Historical IncidentsIncident database, breach recordsPattern indicators

Phase 3: Risk Analysis

Risk analysis determines the likelihood and impact of each identified risk:

FactorQuantitative ApproachQualitative Approach
LikelihoodEPSS score (0.0 - 1.0), historical frequencyVery Low / Low / Medium / High / Critical
ImpactFinancial loss estimate (FAIR model)Negligible / Minor / Moderate / Major / Catastrophic
Risk ValueLikelihood x Impact = Expected Annual LossRisk Matrix position
ConfidenceStatistical confidence intervalAssessment certainty level

Phase 4: Risk Evaluation

Risk evaluation compares analyzed risks against acceptance criteria to determine treatment priority:

Risk LevelScore RangeTreatmentResponse Time
Critical9.0 - 10.0Immediate remediation24 hours
High7.0 - 8.9Priority remediation7 days
Medium4.0 - 6.9Scheduled remediation30 days
Low2.0 - 3.9Accept or mitigate90 days
Informational0.0 - 1.9Accept and monitorNext review cycle

Implementation in Elixir

The Prismatic Platform implements risk assessment as a composable pipeline of assessment stages, each producing evidence artifacts with confidence scores:

defmodule PrismaticPerimeter.RiskAssessment do
  @moduledoc """
  Evidence-based risk assessment engine for external attack surface monitoring.
  Combines asset discovery, vulnerability detection, and threat intelligence
  into a unified risk score with confidence levels.
  """

  alias PrismaticPerimeter.{AssetDiscovery, VulnerabilityScanner, ThreatIntel}
  alias PrismaticPerimeter.Scoring.{RiskCalculator, ConfidenceWeighter}

  @type risk_level :: :critical | :high | :medium | :low | :informational
  @type assessment_result :: %{
    domain: String.t(),
    risk_score: float(),
    grade: atom(),
    confidence: float(),
    findings: [finding()],
    compliance: map()
  }

  @spec assess(String.t(), keyword()) :: {:ok, assessment_result()} | {:error, term()}
  def assess(domain, opts \\ []) do
    frameworks = Keyword.get(opts, :frameworks, [:nis2, :zkb])

    with {:ok, assets} <- AssetDiscovery.discover(domain),
         {:ok, vulns} <- VulnerabilityScanner.scan(assets),
         {:ok, threats} <- ThreatIntel.enrich(assets),
         {:ok, compliance} <- assess_compliance(assets, vulns, frameworks) do
      findings = merge_findings(vulns, threats)
      risk_score = RiskCalculator.calculate(findings, assets)
      confidence = ConfidenceWeighter.compute(findings)
      grade = score_to_grade(risk_score)

      {:ok, %{
        domain: domain,
        risk_score: risk_score,
        grade: grade,
        confidence: confidence,
        findings: findings,
        compliance: compliance,
        assessed_at: DateTime.utc_now(),
        asset_count: length(assets)
      }}
    end
  end

  @spec score_to_grade(float()) :: atom()
  defp score_to_grade(score) when score >= 850, do: :A
  defp score_to_grade(score) when score >= 700, do: :B
  defp score_to_grade(score) when score >= 550, do: :C
  defp score_to_grade(score) when score >= 400, do: :D
  defp score_to_grade(_score), do: :F
end

Risk Scoring Model

The Prismatic Platform uses a numeric scoring system (300-900) mapped to letter grades, similar to credit scoring models used by SecurityScorecard and BitSight:

GradeScore RangeRisk LevelInterpretation
A850 - 900MinimalExcellent security posture, proactive controls
B700 - 849LowGood security posture, minor improvements possible
C550 - 699ModerateAdequate security posture, several gaps to address
D400 - 549HighPoor security posture, significant remediation needed
F300 - 399CriticalSevere security deficiencies, immediate action required

The score is computed from weighted risk categories:

defmodule PrismaticPerimeter.Scoring.RiskCalculator do
  @moduledoc "Weighted risk score calculation from assessment findings."

  @category_weights %{
    network_security: 0.20,
    dns_health: 0.10,
    patching_cadence: 0.15,
    endpoint_security: 0.10,
    ip_reputation: 0.10,
    application_security: 0.15,
    leaked_credentials: 0.10,
    social_engineering: 0.10
  }

  @spec calculate([finding()], [asset()]) :: float()
  def calculate(findings, assets) do
    category_scores =
      findings
      |> Enum.group_by(& &1.category)
      |> Enum.map(fn {category, cat_findings} ->
        weight = Map.get(@category_weights, category, 0.05)
        category_score = compute_category_score(cat_findings, assets)
        {category, category_score * weight}
      end)

    base_score = category_scores |> Enum.map(&elem(&1, 1)) |> Enum.sum()
    normalize_to_range(base_score, 300, 900)
  end

  defp compute_category_score(findings, assets) do
    severity_penalties =
      findings
      |> Enum.map(&severity_to_penalty/1)
      |> Enum.sum()

    max(0.0, 1.0 - severity_penalties / max(length(assets), 1))
  end

  defp severity_to_penalty(%{severity: :critical}), do: 0.40
  defp severity_to_penalty(%{severity: :high}), do: 0.20
  defp severity_to_penalty(%{severity: :medium}), do: 0.10
  defp severity_to_penalty(%{severity: :low}), do: 0.03
  defp severity_to_penalty(_), do: 0.01
end

Compliance Assessment

Risk assessment feeds directly into compliance evaluation. The Prismatic Platform maps risk findings to regulatory requirements for NIS2 Directive (EU 2022/2555) and ZKB 264/2025 Sb. (Czech cybersecurity law):

RegulationScopeKey RequirementsAssessment Method
NIS2Essential and important EU entitiesRisk management, incident reporting, supply chain securityControl mapping against 21 security measures
ZKB 264/2025Czech critical infrastructureAsset management, access control, incident handlingControl mapping against 30 technical measures
GDPRPersonal data processorsData protection impact assessmentData flow analysis, control verification
ISO 27001ISMS-certified organizationsAnnex A control compliance93 controls across 4 themes
defmodule PrismaticPerimeter.Compliance.NIS2Assessor do
  @moduledoc "NIS2 Directive compliance assessment based on risk findings."

  @nis2_measures [
    :risk_analysis_policies,
    :incident_handling,
    :business_continuity,
    :supply_chain_security,
    :network_security,
    :vulnerability_handling,
    :effectiveness_assessment,
    :cryptography_encryption,
    :access_control,
    :multi_factor_auth
  ]

  @spec assess([finding()], [asset()]) :: {:ok, compliance_result()}
  def assess(findings, assets) do
    results =
      @nis2_measures
      |> Enum.map(fn measure ->
        relevant = Enum.filter(findings, &measure_relevant?(&1, measure))
        status = evaluate_measure(measure, relevant, assets)
        {measure, status}
      end)
      |> Map.new()

    overall = compute_overall_compliance(results)

    {:ok, %{
      framework: :nis2,
      measures: results,
      overall_score: overall,
      compliant: overall >= 0.80,
      gaps: identify_gaps(results)
    }}
  end
end

Confidence Scoring

Every risk assessment in the Prismatic Platform carries a confidence score that quantifies the reliability of the assessment. This aligns with the platform's NABLA epistemic framework, where claims require evidence provenance:

Confidence LevelRangeInterpretationAction
High0.85 - 1.00Multiple independent evidence sources, recent dataAct on findings
Medium0.60 - 0.84Some evidence, partially corroboratedAct with awareness of uncertainty
Low0.40 - 0.59Limited evidence, aged data, single sourceInvestigate further before acting
Very Low0.00 - 0.39Insufficient evidenceDo not act, collect more data
defmodule PrismaticPerimeter.Scoring.ConfidenceWeighter do
  @moduledoc "Computes confidence scores for risk assessment findings."

  @spec compute([finding()]) :: float()
  def compute(findings) do
    if Enum.empty?(findings) do
      0.0
    else
      findings
      |> Enum.map(&finding_confidence/1)
      |> then(fn scores ->
        Enum.sum(scores) / length(scores)
      end)
      |> Float.round(3)
    end
  end

  defp finding_confidence(finding) do
    base = source_reliability(finding.source)
    age_factor = data_freshness(finding.observed_at)
    corroboration = corroboration_factor(finding.corroborating_sources)

    min(1.0, base * age_factor * corroboration)
  end

  defp source_reliability(:active_scan), do: 0.95
  defp source_reliability(:certificate_transparency), do: 0.90
  defp source_reliability(:dns_query), do: 0.90
  defp source_reliability(:osint_feed), do: 0.70
  defp source_reliability(:passive_observation), do: 0.60
  defp source_reliability(_), do: 0.50

  defp data_freshness(observed_at) do
    age_hours = DateTime.diff(DateTime.utc_now(), observed_at, :hour)

    cond do
      age_hours < 24 -> 1.0
      age_hours < 168 -> 0.90
      age_hours < 720 -> 0.75
      age_hours < 2160 -> 0.50
      true -> 0.30
    end
  end
end

Attack Surface Risk Assessment

The Prismatic Perimeter module specializes in External Attack Surface Management (EASM), where risk assessment focuses on externally visible assets:

Asset TypeDiscovery MethodRisk FactorsTypical Findings
DomainsDNS enumeration, subdomain brute-forceDangling DNS, subdomain takeoverExpired subdomains, misconfigured CNAME
IP AddressesDNS resolution, BGP analysisOpen ports, known-bad reputationExposed admin interfaces, unpatched services
CertificatesCertificate Transparency logsExpiry, weak algorithms, SANsExpired certs, SHA-1 usage, wildcard overuse
Web ApplicationsHTTP probing, technology fingerprintingOWASP Top 10 vulnerabilitiesMissing security headers, outdated frameworks
Cloud ResourcesCloud provider API, DNS patternsMisconfiguration, public exposureOpen S3 buckets, public databases
Email InfrastructureMX/SPF/DKIM/DMARC analysisSpoofing susceptibilityMissing DMARC, weak SPF policies

Risk Treatment Strategies

After evaluation, each risk receives a treatment decision:

StrategyDescriptionWhen to UseExample
MitigateReduce likelihood or impactRisk above appetite, cost-effective controls existPatch critical vulnerability
AcceptAcknowledge and monitorRisk within appetite, treatment cost exceeds impactLow-severity informational finding
TransferShare risk with third partyFinancial risk, insurable eventsCyber insurance, SLA with vendor
AvoidEliminate the risk sourceRisk unacceptable, no effective controlsDecommission exposed legacy system

Continuous Risk Monitoring

The Prismatic Platform implements continuous risk assessment rather than point-in-time snapshots. Risk scores update in real-time as new evidence arrives:

defmodule PrismaticPerimeter.RiskMonitor do
  @moduledoc "Continuous risk monitoring with event-driven score updates."
  use GenServer

  alias PrismaticPerimeter.RiskAssessment

  @reassessment_interval :timer.minutes(15)

  @impl GenServer
  def init(opts) do
    domains = Keyword.fetch!(opts, :domains)
    schedule_reassessment()

    {:ok, %{domains: domains, scores: %{}, last_assessed: %{}}}
  end

  @impl GenServer
  def handle_info(:reassess, state) do
    updated_scores =
      state.domains
      |> Task.async_stream(&reassess_domain/1, max_concurrency: 5, timeout: 30_000)
      |> Enum.reduce(state.scores, fn
        {:ok, {:ok, result}}, acc ->
          emit_score_change(acc, result)
          Map.put(acc, result.domain, result)

        {:ok, {:error, _reason}}, acc ->
          acc
      end)

    schedule_reassessment()
    {:noreply, %{state | scores: updated_scores}}
  end

  defp reassess_domain(domain) do
    RiskAssessment.assess(domain, frameworks: [:nis2, :zkb])
  end

  defp emit_score_change(previous_scores, new_result) do
    case Map.get(previous_scores, new_result.domain) do
      nil -> :ok
      prev when prev.risk_score != new_result.risk_score ->
        :telemetry.execute(
          [:prismatic, :perimeter, :risk_score_changed],
          %{old_score: prev.risk_score, new_score: new_result.risk_score},
          %{domain: new_result.domain, grade: new_result.grade}
        )
      _ -> :ok
    end
  end

  defp schedule_reassessment do
    Process.send_after(self(), :reassess, @reassessment_interval)
  end
end

Dashboard Visualization

Risk assessment results are presented through a LiveView dashboard at /perimeter:

WidgetData SourceUpdate Frequency
Security RatingOverall risk score with letter gradeReal-time
Risk Trend30-day risk score history chartEvery 15 minutes
Top RisksHighest severity findings rankedReal-time
Compliance StatusNIS2/ZKB compliance percentageOn assessment
Asset InventoryDiscovered assets with risk annotationsOn discovery
Threat MapGeographic distribution of threat sourcesHourly

Context in Prismatic

Risk assessment is a central capability of the Prismatic Perimeter EASM module. The platform combines automated attack surface discovery with evidence-based risk scoring to produce security ratings (A-F grades, 300-900 numeric scores) that compete with commercial platforms like BitSight and SecurityScorecard. Every assessment carries confidence scores in compliance with the platform's NABLA epistemic framework, ensuring that risk decisions are backed by verifiable evidence with known reliability levels.

The risk assessment engine integrates with 120+ OSINT tools and adapters for threat intelligence enrichment, and maps findings to regulatory frameworks including NIS2 Directive and ZKB 264/2025 Sb. for compliance assessment.

See Also

  • Architecture -- Platform security architecture
  • Capabilities -- EASM and risk assessment capabilities
  • OSINT -- Intelligence tools feeding risk assessment
  • Teams -- Security teams conducting risk assessment

Connect & Contribute

Created by Tomas Korcak (korczis) | Open Source under GHL