SSDLC Hub
SSDLC Series / Part 2 of 2

Putting Strategy into Practice: How We Tamed SonarQube using TLCTC

In Part 1 we defined the roles. In Part 2 we show the results — how a messy CWE report turned into actionable threat intelligence by automating context-aware mapping.

BK
Bernhard Kreinz
Loading read time...
Series Context

In Part 1, we distinguished between the strategic “Programmer” and tactical “Coder.” This post applies that theory to a real-world problem: a SonarQube report full of unprioritized findings.

Introduction: The Problem of Noise

Our journey began where many security initiatives stall: with a problem. Our SAST report was a sea of red — a long, flat list of Common Weakness Enumeration (CWE) findings. While technically accurate, it was overwhelming and lacked strategic context. A CWE-120 (Buffer Copy) meant nothing to our risk managers, and “fix everything” meant nothing to our developers.

The breakthrough came when we stopped looking at “what” was wrong (the CWE) and started looking at “how” it could be exploited (the TLCTC cluster).

The “Aha!” Moment

A single CWE could map to different threats depending on where it lived in the architecture.

  • If a buffer overflow (CWE-120) is in the server-side API, it's #2 Exploiting Server.
  • If the exact same flaw is in a client-side library, it's #3 Exploiting Client.

This distinction, derived from the axioms of the TLCTC framework, completely changed our prioritization strategy.

Methodology: From Manual to Automated

1. Mapping Workshops

We started by manually reviewing our backlog. We took real findings and mapped them to TLCTC clusters. This exercise built a shared language. CWE-863 (Incorrect Authorization) wasn't just a bug anymore; it was identified as a potential #1 Abuse of Functions vector.

2. Checklists via the “Attacker's View”

To make this actionable for developers, we adopted the “Attacker's View” vs. “Developer's View” concept. For #4 Identity Theft, instead of listing 20 different CWEs, we gave developers a single clear directive:

Attacker's View: “I abuse credentials to operate as a legitimate identity.”
Developer's View: “I must implement secure credential lifecycle management: proper hashing, secure transmission, and robust session handling.”

3. Automating with SonarQube

We built a custom post-processing script to automate the triage. The logic was simple but powerful: combining the specific vulnerability (CWE) with the architectural context (file path) to determine the threat cluster.

Click to Enlarge
INPUT DECISION CONTEXT CLUSTER OUTPUT SonarQube JSON raw CWE findings Check CWE ID credentials? code injection? CWE-798/259/321 CWE-89/120/78 CWE-798 hardcoded credentials File Path? /server/api vs. /client/ui /api/ /ui/ #4 IDENTITY TLCTC-04.00 #2 SERVER EXP. TLCTC-02.00 #3 CLIENT EXP. TLCTC-03.00 Strategic Risk Dashboard
Figure 1: The automated triage logic flow. We combine the raw finding (CWE) with architectural context (path) to derive the strategic threat-cluster tag.
triage-logic.js
function mapToTLCTC(cwe, filePath) {
  // #4 Identity Theft (Credentials)
  if (['CWE-798', 'CWE-259', 'CWE-321'].includes(cwe)) {
    return 'TLCTC-04.00';
  }

  // #2 vs #3 based on architectural context
  if (['CWE-89', 'CWE-120', 'CWE-78'].includes(cwe)) {
    if (filePath.includes('/server/') || filePath.includes('/api/')) {
      return 'TLCTC-02.00'; // Server-side implementation flaw
    }
    if (filePath.includes('/client/') || filePath.includes('/ui/')) {
      return 'TLCTC-03.00'; // Client-side implementation flaw
    }
  }

  return 'TLCTC-Unknown';
}

Impact: Attack Path Thinking

The real win wasn't tagging; it was connecting the dots. Before TLCTC, we saw two medium-risk bugs: “hardcoded creds” and “SQL injection.” After TLCTC, we saw a high-severity attack path.

By recognising these as #4 Identity Theft and #2 Exploiting Server, we could model the sequence:

#9 (Phishing) → #4 (Steal Hardcoded Creds) → #2 (Auth & Exploit SQLi)

This perspective completely changed our prioritization. We weren't just fixing bugs; we were breaking attack chains.

Results & Recommendations

The shift in perspective improved communication across the board. We used the Bow-Tie model to explain the strategy to management: “We are fixing controls on the left side (causes) to prevent the centre event (compromise).”

Area Before TLCTC After TLCTC
SAST Triage Whack-a-mole with flat CWE lists Prioritised by threat cluster & attack paths
Reporting “We have 150 open vulnerabilities” “Our primary risk is #2 Exploiting Server”
Architecture Lacked security context Explicitly addresses #1, #4, #5 by design
Developer Guidance Long lists of CWEs to memorise Attacker's View / Developer's View per cluster

Conclusion

If you want to replicate this, start small. Don't try to map every CWE immediately. Start with your existing SAST report, apply the Programmer-vs-Coder roles defined in Part 1, and use the simple dual-notation (#X for strategy, TLCTC-XX.YY for tooling). The framework gives you the mental model to turn noise into signal.

References

  1. Kreinz, B. TLCTC White Paper V2.1 — CWE clarifications and dual-notation. Read V2.1.
  2. Kreinz, B. TLCTC White Paper V2.1 — Standardising operational cybersecurity. Read V2.1.
  3. Kreinz, B. TLCTC White Paper V2.1 — Axioms and assumptions. Read V2.1.
  4. Kreinz, B. TLCTC White Paper V2.1 — Cluster definitions (#1 Abuse of Functions). Read V2.1.
  5. Kreinz, B. TLCTC White Paper V2.1 — Attacker's View vs. Developer's View. Read V2.1.
  6. Kreinz, B. TLCTC White Paper V2.1 — Sequences and attack-path notation. Read V2.1.
  7. Kreinz, B. TLCTC White Paper V2.1 — Cyber Bow-Tie. Read V2.1.
  8. Kreinz, B. TLCTC White Paper V2.1 — Multi-layer notation convention. Read V2.1.