Locked and Loaded: How state guns fuel South Africa’s deadly crime wave
When former police colonel Chris Lodewyk Prinsloo walked free on parole after just four years of an 18-year sentence for flooding the Cape Flats with weapons, the underground gun trade cheered.
Back in 2016, Prinsloo was convicted on more than 20 counts of racketeering, corruption and money-laundering for dealing roughly R9 million in lethal firearms to gangsters — many of those guns were meant to be destroyed.
Prinsloo, once head of SAPS’s Gauteng Firearms, Liquor and Second-Hand Goods Unit, ran a covert operation between 2007 and 2015 in which thousands of confiscated or decommissioned police firearms — including pistols and rifles — were siphoned from State stores and sold to Cape Flats gang leaders.
The weapons, some originally seized from criminals, were logged as “destroyed” on official registers but instead delivered through corrupt intermediaries to gangs such as the Americans and the Hard Livings in the Western Cape. Forensic analysis later linked these “Prinsloo guns” to more than 1,000 murders, including children caught in crossfire. His case exposed how deeply South Africa’s armouries had been compromised — and how the State’s own guns became tools of its citizens’ destruction.
Across South Africa, thousands of state-issued guns have taken the same path: from barracks and police stations into the hands of criminals. The State has become one of the country’s biggest suppliers of illegal weapons — a deadly irony at the heart of South Africa’s violent crime crisis.
A Nation Armed — and Bleeding
South African State entities — including the police, defence force, correctional services, and metro police — collectively hold around 2.2 million firearms. Every year, roughly 1,800 state-owned guns are lost or stolen. Many later resurface at murder scenes.
In the 2023/24 financial year, the South African Police Service (SAPS) reported 741 firearms lost or stolen, exceeding its own internal target. But that number only tells part of the story. The South African National Defence Force (SANDF) and other state bodies often fail to publish reliable figures, and when they do, data is fragmented and incomplete.
Without a centralised system, there is no clear national picture of how many state firearms have slipped through the cracks. What is clear is that each missing weapon carries deadly potential.
While the SANDF requested additional time to review and respond to questions posed by IOL, the SAPS had neither acknowledged nor replied to the detailed query at the time of publication. The Private Security Industry Regulatory Authority (PSIRA) confirmed receipt of IOL’s questions last week, but no formal response had been received by Tuesday evening.
Systemic Failure — ‘A Criminogenic Environment’
The leakage of State firearms is not the work of a few rogue officers, says Professor Kholofelo Rakubu, Head of the Department of Law, Safety and Security Management at Tshwane University of Technology. It is the product of systemic decay.
“This isn’t a case of a few bad apples,” she said. “All the conditions for leakage are structurally present — motivated insiders, poorly guarded armouries, and no capable oversight.”
Rakubu draws on Routine Activity Theory to explain the pattern: crime occurs when a motivated offender, a suitable target, and the absence of capable guardianship converge. “In SAPS and SANDF, all three elements are disturbingly present,” she said.
Armouries lack biometric access and surveillance; inventory logs are still kept on paper.
“Manual records can be falsified. Losses go unreported due to fear, inertia, or corruption,” she said. “These institutions have become criminogenic environments — settings that facilitate crime rather than deter it.”
According to Rakubu, a culture of impunity within law enforcement allows negligence and corruption to thrive.
“Firearms can vanish from State custody with little trace and even less consequence,” she said. “When officers lose weapons and face no disciplinary action, it sends a message that misconduct is tolerable.”
In 2022/23, SAPS recovered only about 5% of the more than 8,000 firearms lost or stolen that year. For Rakubu, the low recovery rate reflects a collapse in internal controls.
“Losses are often only discovered when a gun turns up at a crime scene,” she said.
‘The State Is Feeding the Black Market’ — Gun Free South Africa
Dr Stanley Maphosa, Executive Director of Gun Free South Africa (GFSA), describes the leakage of state-owned firearms as “an extremely serious problem.”
He said large discrepancies in official inventory figures indicate that the government cannot confidently account for all weapons issued to SAPS, SANDF and other state agencies.
“That creates ideal conditions for diversion,” he said.
The notorious “Prinsloo guns” scandal remains the clearest example.
“Those guns alone have been linked to more than a thousand murders,” Maphosa said.
“When the state loses control of its own firearms, it directly fuels the illegal market, destabilises communities, and undermines national safety.”
However, Maphosa noted that the state is not the only culprit. Civilians and private security companies also contribute to the problem.
“In 2023/24, civilians reported 8,452 guns lost or stolen — around 23 per day — compared to 741 by police,” he said.
“The state is part of the problem, but the private pool is an even bigger feeder into the criminal market.”
{
“currency”: “ZAR”,
“period”: “2023/24”,
“stats”: [
{ “label”: “Estimated value of Prinsloo’s illegal firearm trade”, “value”: 9000000, “unit”: “R” },
{ “label”: “Murders linked to ‘Prinsloo guns'”, “value”: 1000, “unit”: “cases” },
{ “label”: “State-owned firearms (SAPS, SANDF, Correctional Services, Metro Police)”, “value”: 2200000, “unit”: “firearms” },
{ “label”: “Average number of state firearms lost or stolen per year”, “value”: 1800, “unit”: “firearms” },
{ “label”: “SAPS firearms lost or stolen (2023/24)”, “value”: 741, “unit”: “firearms” },
{ “label”: “Civilians’ firearms lost or stolen (2023/24)”, “value”: 8452, “unit”: “firearms” },
{ “label”: “Firearms recovered by SAPS (2022/23)”, “value”: 400, “unit”: “firearms” },
{ “label”: “People shot dead daily in South Africa (2024)”, “value”: 33, “unit”: “deaths per day” },
{ “label”: “People shot dead daily in 2009”, “value”: 18, “unit”: “deaths per day” }
],
“visuals”: [
{
“type”: “stat-cards”,
“items”: [
{ “key”: “State-owned firearms”, “format”: “integer_grouped” },
{ “key”: “Average number of state firearms lost or stolen per year”, “format”: “integer_grouped” },
{ “key”: “People shot dead daily in South Africa (2024)”, “format”: “integer0” }
]
},
{
“type”: “bar”,
“title”: “Firearms lost or stolen in 2023/24”,
“xAxis”: “Category”,
“yAxis”: “Firearms”,
“series”: [
{
“name”: “Lost or stolen firearms”,
“data”: [
{ “Category”: “SAPS”, “Firearms”: 741 },
{ “Category”: “Civilians”, “Firearms”: 8452 }
]
}
],
“tooltip”: “Display exact numbers and data source on hover.”
},
{
“type”: “line”,
“title”: “Daily gun deaths in South Africa (2009–2024)”,
“xAxis”: “Year”,
“yAxis”: “Deaths per day”,
“series”: [
{
“name”: “Daily gun deaths”,
“data”: [
{ “Year”: 2009, “Deaths per day”: 18 },
{ “Year”: 2024, “Deaths per day”: 33 }
]
}
]
},
{
“type”: “pie”,
“title”: “Source of lost or stolen firearms (2023/24)”,
“series”: [
{ “name”: “SAPS and State Agencies”, “value”: 741 },
{ “name”: “Civilians and Private Security”, “value”: 8452 }
],
“legend”: true,
“tooltip”: “Show relative contribution of state vs private losses.”
},
{
“type”: “waffle”,
“title”: “Recovery rate of lost firearms (2022/23)”,
“grid”: { “rows”: 10, “cols”: 10 },
“explanation”: “Show that only about 5% of 8,000 lost or stolen firearms were recovered.”,
“legend”: [
{ “label”: “Recovered”, “value”: 5, “unit”: “%” },
{ “label”: “Still missing”, “value”: 95, “unit”: “%” }
]
}
],
“copy_deck”: {
“heading”: “How State Guns Fuel South Africa’s Violence”,
“subheading”: “Data on firearm leakage from the State and civilians, and its link to gun deaths.”,
“footnotes”: [
“Figures from SAPS Annual Report 2023/24, Gun Free South Africa, and judicial records from Prinsloo’s conviction.”,
“Recovery rate based on SAPS internal data for 2022/23.”
],
“sources”: [
“South African Police Service (SAPS) Annual Report 2023/24.”,
“Gun Free South Africa (GFSA).”,
“Institute for Security Studies (ISS) interviews and analysis.”,
“Judgment: State v. Prinsloo (2016).”
]
},
“labels”: {
“ctaDownload”: “Download infographic”,
“ctaCopySource”: “Copy data sources”,
“lastUpdated”: “Last updated”
},
“design”: {
“palette”: {
“primary”: “#B91C1C”,
“neutral”: “#111827”,
“accent”: “#F59E0B”,
“muted”: “#9CA3AF”,
“bg”: “auto”,
“fg”: “auto”
},
“layout”: {
“gap”: 16,
“cardRadius”: 16,
“cardShadow”: “soft”
},
“labels”: {
“numberFormatting”: {
“currency0”: { “style”: “currency”, “currency”: “ZAR”, “maximumFractionDigits”: 0 },
“integer_grouped”: { “style”: “decimal”, “useGrouping”: true, “maximumFractionDigits”: 0 },
“integer0”: { “style”: “decimal”, “maximumFractionDigits”: 0 },
“percent1”: { “style”: “percent”, “maximumFractionDigits”: 1, “scale”: 0.01 }
}
}
}
}
/**
* South Africa Gun Leakage and Violence Custom Element
* A fully self-contained, vanilla-JS component using Shadow DOM for maximum safety and encapsulation.
*/
class SAGunLeakageViolence extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: ‘open’ }); // Use Shadow DOM for full encapsulation
this.data = this.loadData();
this.config = this.data.design;
this.palette = this.config.palette;
this.ariaLabel = “Infographics showing state firearm losses, recovery rates, and rising gun deaths in South Africa.”; // Set ARIA label
}
connectedCallback() {
if (!this.data) {
this.shadowRoot.innerHTML = `
Error: Data not found. Ensure the component’s JSON data slot is present and valid.
`;
return;
}
this.render();
this.setupDownload();
this.setupCopySource();
// Set the main ARIA role and label for accessibility
this.setAttribute(‘role’, ‘figure’);
this.setAttribute(‘aria-label’, this.ariaLabel);
// Simple scroll-based fade-in (animation)
this.style.opacity = 0;
if (typeof IntersectionObserver !== ‘undefined’) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
this.style.transition = ‘opacity 1s ease-out’;
this.style.opacity = 1;
observer.unobserve(this);
}
});
}, { threshold: 0.1 });
observer.observe(this);
} else {
this.style.opacity = 1; // Fallback for no observer support
}
}
loadData() {
// Reads data from the external script[type=”application/json”] tag
const dataSlot = document.getElementById(‘sa-gun-leakage-violence-data’);
if (dataSlot && dataSlot.textContent) {
try {
return JSON.parse(dataSlot.textContent);
} catch (e) {
console.error(“Error parsing component data JSON:”, e);
return null;
}
}
return null;
}
// — Utility Functions (Self-Contained) —
// International Number Formatting (for safety and self-containment)
formatNumber(value, formatKey) {
const formatConfig = this.config.labels.numberFormatting[formatKey];
if (!formatConfig) return value.toString();
const options = {
style: formatConfig.style,
currency: formatConfig.currency,
useGrouping: formatConfig.useGrouping,
maximumFractionDigits: formatConfig.maximumFractionDigits
};
const locale=”en-ZA”; // South African locale
let scaledValue = value;
if (formatConfig.scale) {
scaledValue = value * formatConfig.scale;
}
return new Intl.NumberFormat(locale, options).format(scaledValue);
}
// Finds a stat value by label
getStatValue(label) {
const stat = this.data.stats.find(s => s.label === label);
return stat ? stat.value : 0;
}
// — Rendering Functions —
render() {
const styles = this.getStyles();
const content = this.getHTML();
this.shadowRoot.innerHTML = `${styles}${content}`;
this.renderBarChart(this.shadowRoot.querySelector(‘#bar-chart-container’));
this.renderLineChart(this.shadowRoot.querySelector(‘#line-chart-container’));
this.renderPieChart(this.shadowRoot.querySelector(‘#pie-chart-container’));
this.renderWaffleChart(this.shadowRoot.querySelector(‘#waffle-chart-container’));
}
getStyles() {
const { primary, neutral, accent, muted, bg, fg } = this.palette;
const { cardRadius, cardShadow, gap } = this.config.layout;
// Simplified CSS for self-contained component, focusing on core design
return `
:host {
display: block;
font-family: system-ui, -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Oxygen, Ubuntu, Cantarell, “Open Sans”, “Helvetica Neue”, sans-serif;
color: var(–fg, #E5E7EB); /* Default to light text for dark background */
background-color: var(–bg, #1F2937); /* Default to dark background for cards */
padding: 16px;
border-radius: ${cardRadius}px;
box-sizing: border-box;
}
:host([data-dark-mode]) {
color: var(–fg, #E5E7EB);
background-color: var(–bg, #1F2937);
}
.header-bar {
padding-bottom: ${gap}px;
margin-bottom: ${gap}px;
border-bottom: 2px solid ${primary};
}
h1 { font-size: 1.5em; color: ${primary}; margin: 0 0 4px 0; }
h2 { font-size: 1.1em; color: ${muted}; margin: 0 0 16px 0; }
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: ${gap}px;
}
.stat-cards {
display: flex;
flex-wrap: wrap;
gap: ${gap}px;
margin-bottom: ${gap}px;
}
.stat-card {
flex: 1 1 200px;
padding: ${gap}px;
border-radius: ${cardRadius}px;
background: #374151; /* Darker background for stat cards */
box-shadow: ${cardShadow === ‘soft’ ? ‘0 4px 6px rgba(0,0,0,0.1)’ : ‘none’};
border-left: 4px solid ${accent};
}
:host([data-dark-mode]) .stat-card { background: #374151; }
.stat-value {
font-size: 2em;
font-weight: 700;
color: ${primary};
margin-bottom: 4px;
}
.stat-label {
font-size: 0.8em;
color: #D1D5DB; /* Lighter text for dark backgrounds */
}
:host([data-dark-mode]) .stat-label { color: #D1D5DB; }
.chart-card {
background: #1F2937; /* Darker background for chart cards */
padding: ${gap}px;
border-radius: ${cardRadius}px;
box-shadow: ${cardShadow === ‘soft’ ? ‘0 4px 6px rgba(0,0,0,0.05)’ : ‘none’};
margin-bottom: ${gap}px;
border: 1px solid #374151; /* Subtle border for definition */
}
:host([data-dark-mode]) .chart-card { background: #1F2937; border: 1px solid #374151; }
.chart-title {
font-size: 1.2em;
font-weight: 600;
margin-bottom: 10px;
color: #F3F4F6; /* Lighter text for dark backgrounds */
}
:host([data-dark-mode]) .chart-title { color: #F3F4F6; }
/* Simple Chart Styles (using only DIVs/SVG for self-containment) */
.bar-chart, .line-chart, .pie-chart, .waffle-chart { height: 200px; width: 100%; }
/* Bar Chart Specific */
.bar-chart-bar-container { display: flex; align-items: flex-end; height: 100px; margin-bottom: 10px;}
.bar {
background-color: ${primary};
margin: 0 5px;
width: 50%;
text-align: center;
display: flex;
flex-direction: column;
justify-content: flex-end;
border-radius: 4px 4px 0 0;
}
.bar-label { font-size: 0.7em; text-align: center; margin-top: 5px; color: ${muted}; }
.bar-value { font-size: 0.9em; font-weight: bold; color: white; padding-top: 5px; }
/* Line Chart Specific (Simplified) */
.line-chart-data { display: flex; justify-content: space-between; align-items: center; height: 100px; position: relative; }
.data-point { text-align: center; }
.point-value { font-size: 1.5em; font-weight: bold; color: ${primary}; }
.point-label { font-size: 0.8em; color: ${muted}; }
.line-connector {
position: absolute;
top: 50%;
left: 10%;
right: 10%;
height: 2px;
background: ${accent};
transform: translateY(-50%);
z-index: -1;
}
.increase-callout {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
background: ${accent};
color: ${neutral}; /* Text color for the callout against accent background */
padding: 4px 8px;
border-radius: 4px;
font-size: 0.8em;
font-weight: bold;
}
:host([data-dark-mode]) .increase-callout { color: #111827; }
/* Waffle Chart Specific (Simplified) */
.waffle-grid {
display: grid;
grid-template-columns: repeat(10, 1fr);
gap: 2px;
width: 200px; /* fixed size for 10×10 */
height: 200px;
margin: 0 auto 10px;
}
.waffle-unit {
width: 100%;
height: 100%;
background-color: ${muted}33; /* light muted */
}
.waffle-unit.recovered {
background-color: ${accent};
}
.waffle-legend {
text-align: center;
font-size: 0.9em;
margin-top: 10px;
}
.legend-item { margin: 0 10px; display: inline-flex; align-items: center; }
.legend-dot { width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; }
/* Footer & Actions */
.footer {
margin-top: 20px;
padding-top: 10px;
border-top: 1px dashed ${muted}55;
}
.action-button {
background-color: ${neutral};
color: white;
border: none;
padding: 8px 16px;
border-radius: 8px;
cursor: pointer;
font-size: 0.9em;
margin-right: 8px;
transition: background-color 0.3s;
}
.action-button:hover { background-color: ${primary}; }
.sources-list {
font-size: 0.75em;
color: ${muted};
list-style: none;
padding: 0;
margin-top: 10px;
}
.footnotes {
font-size: 0.7em;
color: ${muted};
margin-top: 10px;
padding-top: 5px;
border-top: 1px solid #374151; /* Darker border for footnotes */
}
:host([data-dark-mode]) .footnotes { border-top: 1px solid #374151; }
`;
}
getHTML() {
const { heading, subheading, footnotes, sources } = this.data.copy_deck;
const { ctaDownload, ctaCopySource } = this.data.labels;
// Render Stat Cards
const statCardsHTML = this.data.visuals.find(v => v.type === ‘stat-cards’).items.map(item => {
const stat = this.data.stats.find(s => s.label === item.key);
if (!stat) return ”;
const formattedValue = this.formatNumber(stat.value, item.format) + (stat.unit === ‘R’ ? ” : ` ${stat.unit}`);
return `
`;
}).join(”);
// Calculate line chart increase for tooltip
const lineData = this.data.visuals.find(v => v.type === ‘line’).series[0].data;
const death2009 = lineData.find(d => d.Year === 2009)[‘Deaths per day’];
const death2024 = lineData.find(d => d.Year === 2024)[‘Deaths per day’];
const increasePercent = this.formatNumber((death2024 – death2009) / death2009 * 100, ‘integer0’);
return `
${this.data.visuals[4].explanation.replace(‘5%’, ‘5%’).replace(‘8,000’, ‘about 8,000’)}
`;
}
// — Chart Implementations (Simplified for No-Library, Self-Contained Constraint) —
renderBarChart(container) {
if (!container) return;
const chartData = this.data.visuals.find(v => v.type === ‘bar’).series[0].data;
const maxVal = Math.max(…chartData.map(d => d.Firearms));
const chartContainer = container.querySelector(‘.bar-chart-bar-container’);
chartContainer.innerHTML = chartData.map((d, index) => {
const height = (d.Firearms / maxVal) * 100; // Scaled height in %
const color = index === 0 ? this.palette.primary : this.palette.accent;
const formattedValue = this.formatNumber(d.Firearms, ‘integer_grouped’);
return `
`;
}).join(”);
chartContainer.insertAdjacentHTML(‘afterend’, `
`);
}
renderLineChart(container) {
if (!container) return;
const lineData = this.data.visuals.find(v => v.type === ‘line’).series[0].data;
const chartContainer = container.querySelector(‘.line-chart-data’);
chartContainer.innerHTML = `
${lineData.map(d => `
`).join(”)}
`;
}
renderPieChart(container) {
if (!container) return;
const pieData = this.data.visuals.find(v => v.type === ‘pie’).series;
const total = pieData.reduce((sum, item) => sum + item.value, 0);
const svg = container.querySelector(‘svg’);
const cx = 100, cy = 100, r = 80;
let cumulativeAngle = 0;
const paths = pieData.map((d, index) => {
const startAngle = cumulativeAngle;
const percentage = d.value / total;
const endAngle = cumulativeAngle + percentage * 360;
cumulativeAngle = endAngle;
const startX = cx + r * Math.cos(startAngle * Math.PI / 180);
const startY = cy + r * Math.sin(startAngle * Math.PI / 180);
const endX = cx + r * Math.cos(endAngle * Math.PI / 180);
const endY = cy + r * Math.sin(endAngle * Math.PI / 180);
const largeArcFlag = percentage > 0.5 ? 1 : 0;
const color = index === 0 ? this.palette.primary : this.palette.accent;
const formattedPercent = this.formatNumber(percentage * 100, ‘integer0’);
// SVG path: Move to center, Line to start, Arc to end, Close path
const pathD = `M ${cx} ${cy} L ${startX} ${startY} A ${r} ${r} 0 ${largeArcFlag} 1 ${endX} ${endY} Z`;
return “;
}).join(”);
const legendHTML = `
const color = index === 0 ? this.palette.primary : this.palette.accent;
const formattedPercent = this.formatNumber((d.value / total) * 100, ‘integer0’);
return ` ${d.name} (${formattedPercent}%)`;
}).join(”)}
`;
svg.innerHTML = paths;
svg.insertAdjacentHTML(‘afterend’, legendHTML);
}
renderWaffleChart(container) {
if (!container) return;
const waffleGrid = container.querySelector(‘.waffle-grid’);
const recoveredPercent = this.data.visuals.find(v => v.type === ‘waffle’).legend.find(l => l.label === ‘Recovered’).value;
let unitsHTML = ”;
for (let i = 0; i < 100; i++) {
const isRecovered = i < recoveredPercent;
unitsHTML += `
`;
}
waffleGrid.innerHTML = unitsHTML;
}
// — Action Handlers —
setupDownload() {
// Mock download action for print-friendly / image export.
// In a production environment, this would call an API or a client-side library (like html2canvas)
const btn = this.shadowRoot.getElementById(‘download-infographic-btn’);
btn.addEventListener(‘click’, () => {
alert(“Download functionality triggered. In a real system, this would generate and download a PNG/SVG or a PDF of the infographic, or trigger a print dialog.”);
});
}
setupCopySource() {
const btn = this.shadowRoot.getElementById(‘copy-sources-btn’);
btn.addEventListener(‘click’, () => {
const sources = this.data.copy_deck.sources.join(‘\n’);
navigator.clipboard.writeText(sources).then(() => {
const originalText = btn.textContent;
btn.textContent=”Copied!”;
setTimeout(() => { btn.textContent = originalText; }, 2000);
}).catch(err => {
alert(‘Could not copy data sources. Please see console for details.’);
console.error(‘Error copying text: ‘, err);
});
});
}
// A simple dark mode detection for demonstration (if the CMS page supports it)
attributeChangedCallback(name, oldValue, newValue) {
if (name === ‘data-dark-mode’ && this.shadowRoot) {
this.render(); // Re-render to apply new styles
}
}
static get observedAttributes() {
return [‘data-dark-mode’];
}
}
// Ensure the custom element is only defined once
if (!customElements.get(‘sa-gun-leakage-violence’)) {
customElements.define(‘sa-gun-leakage-violence’, SAGunLeakageViolence);
}
Inside the armouries — ISS on state and private leakage
Willem Els, Senior Training Coordinator at the Institute for Security Studies (ISS), told IOL that South Africa’s illegal firearm trade is sustained in large part by the very institutions tasked with combating it.
“One of the main providers of illegal firearms in South Africa to the criminal networks is actually the South African Police Service and the military,” he said.
“We see that a lot of these firearms that are being recovered are stolen from there.”
He noted that South Africa’s private security sector is also a major risk area.
“We have a private security grouping that is more or less twice as big as the SAPS and the military. Most of them work with firearms in high-risk operations like cash-in-transit. During those heists, two to three rifles are often stolen by criminal gangs.”
Els said that while South Africa has introduced new firearm legislation since 1994, aimed at reducing illegal gun flow, poor management and lack of data have undermined its impact.
“We know what the problem is — the Central Firearms Registry is not what it’s supposed to be. There are a lot of loopholes, and the management is simply not what it should be.”
He also questioned whether gun control measures are evidence-based: “Since 1994 we’ve made it harder to own guns, but how many of these firearms used in crimes actually come from legal owners? How many are stolen from security forces? We don’t have the data.”
Els warned against assuming that all illegal firearms originate from private owners: “It’s wrong to assume that illegal firearms come from law-abiding gun owners, and then tighten legislation around them, when the real problem lies within the security forces and weak institutional management.”
Digital Deficit — Tech, Chips and Real-time Tracking
Andy Mashaile, retired Interpol ambassador and security strategist, warned that the absence of a digital firearms management system at SAPS, SANDF and municipal police bodies leaves a gaping loophole for the corrupt.
“When you have a digital firearms registry, any firearm that gets dispatched to a police officer when they book for duty would automatically update itself on the system,” he said.
“You do not have to do it manually because it will have a chip. That chip would then speak to the computer in the room where you store your firearms, the arsenal.”
Mashaile argued that such a system would drastically reduce opportunities for manipulation and misappropriation. He added that the chain-of-custody for weapons destined for destruction must be foolproof.
“For firearms to be transported from Pretoria or Johannesburg to a smelter in Vanderbijlpark, you need something foolproof from the very members inside the organisation,” he said.
On accountability, Mashaile called for harsher sentences for those responsible for negligent or corrupt loss of state firearms and an overhaul of the Firearms Act and destruction policies to close loopholes that criminals currently exploit. He also urged enhanced regional policing cooperation to stem cross-border flows of illegal weapons.
A Nation in Crossfire
South Africa is now at crisis-level gun harm, with 33 people shot dead every day, up from 18 per day in 2009.
“We cannot reduce gun violence while the taps of both state and civilian firearms remain open,” Maphosa said.
Rakubu added that leaked state weapons amplify the lethality of crime.
“When military-grade weapons are used in robberies or gang conflicts, the firepower escalates and communities suffer the consequences,” she said.
“It’s a social catastrophe — people begin to doubt whether the institutions meant to protect them are complicit in their suffering.”
The Way Forward — Reform or Rhetoric?
All four experts agree that South Africa’s institutions can be reformed, but only through political will and cultural change.
Rakubu calls for a complete overhaul of police and military ethics training, stronger supervision, and independent oversight.
“Technology alone won’t fix this,” she warned.
“Without ethical leadership and independent oversight, digital systems will just be new tools in the same old hands.”
Maphosa’s recommendations focus on transparency and accountability:
-
A forensic audit of all state firearms and civilian licences issued since 2010.
-
Digitised, corruption-proof chain-of-custody for SAPS and SANDF armouries.
-
Routine destruction of all recovered firearms after forensic processing.
-
Quarterly public reporting of all losses, recoveries, and destructions.
-
Real integrity protections for the new firearm management IT system.
Els agrees that reform must focus on competence and accountability within the state itself.
“We’ve known for decades what the problem is,” he said.
“Until we fix the Central Firearms Registry and strengthen internal management, we’ll keep seeing state and private weapons end up on the streets.”
Mashaile added that technical fixes such as chipped weapons and real-time registries must be paired with legal reform and regional cooperation: “You need harsher sentences, tighter destruction protocols and cross-border policing to close the loopholes that allow stolen state weapons to travel.”
Accountability at Gunpoint
The guns meant to protect South Africans are killing them instead. Behind every leaked weapon lies a paper trail of negligence, corruption, and silence. As experts warn, this is not just a law enforcement failure — it is a crisis of governance and public trust.
Until the state can account for every gun it owns, South Africa will remain a nation armed against itself.
jonisayi.maromo@iol.co.za
IOL News
