Executive Summary
Ubuntu Security Notice USN-8910-1 addresses six critical vulnerabilities in libxml2, a foundational XML parsing library used across Linux distributions, web applications, and enterprise systems. These flaws enable remote code execution (RCE), XML External Entity (XXE) injection, Server-Side Request Forgery (SSRF), and denial-of-service (DoS) attacks.
Security teams must prioritize patching immediately. The vulnerabilities affect systems processing untrusted XML, URIs, or catalog files—a common scenario in web services, document processors, and automated data pipelines.
What Is libxml2 and Why This Advisory Matters
libxml2’s Role in Your Infrastructure
libxml2 is a C-language XML parsing library maintained by the GNOME project. It powers:
- Core OS utilities:
xmllint,xsltproc, system configuration parsers - Web frameworks: Python (lxml), PHP (SimpleXML), Ruby, Node.js bindings
- Enterprise applications: Document management systems, API gateways, SOAP/XML-RPC services
- Automated workflows: Log aggregation, data transformation pipelines, CI/CD systems
A vulnerability in libxml2 cascades across all dependent applications. A single unpatched system can become an attack vector for lateral movement or data exfiltration.
Why These Vulnerabilities Pose Immediate Risk
The six CVEs in USN-8910-1 span multiple attack classes:
| Attack Class | CVEs | Risk Level |
|---|---|---|
| Memory Corruption (RCE) | CVE-2026-86138, CVE-2026-86142 | Critical |
| Parser Bypass (XXE/SSRF) | CVE-2026-86144 | High |
| Resource Exhaustion (DoS) | CVE-2026-86139, CVE-2026-76781 | High/Medium |
| Integer Overflow (DoS) | CVE-2026-86143 | Medium |
Unlike patched vulnerabilities that require specific conditions, these flaws trigger through normal XML processing workflows.
Scope of Affected Systems
Directly Affected:
- Ubuntu 26.04 LTS (all versions prior to USN-8910-1)
- Ubuntu 22.04 LTS, 20.04 LTS (if running vulnerable libxml2 versions)
- Any Linux distribution using unpatched libxml2
Indirectly Affected:
- Web applications accepting XML uploads
- API services parsing SOAP/XML-RPC requests
- Document conversion tools (LibreOffice, Pandoc)
- Log aggregation platforms (Logstash, Splunk)
- Configuration management systems (Ansible, Puppet)
Six Critical Vulnerabilities Explained
CVE-2026-76781: XML Catalog Handling Flaw
Discovered By: Yirou Yang
Severity: Medium
Attack Vector: Local file processing
Technical Details:
libxml2 fails to validate XML catalog structures before parsing. A malformed catalog file triggers incorrect parsing logic, causing a segmentation fault.
Real-World Scenario:
An automated document processor loads XML catalogs from a shared network drive.
An attacker places a crafted catalog file in the directory.
The service crashes, disrupting batch processing for all users.
Detection Indicators:
- Segmentation faults in
xmllintor dependent services - Core dumps referencing catalog parsing functions
- Repeated application restarts without clear cause
CVE-2026-86138: Heap Buffer Overflow in Qualified Names
Severity: Critical
Attack Vector: Remote (malicious XML document)
Impact: RCE or DoS
Technical Details:
libxml2 fails to boundary-check XML qualified names (namespace-prefixed elements). Processing an XML document with an extremely long qualified name (e.g., xmlns:verylongprefix="...") causes a heap buffer overflow.
Exploitation Example:
<?xml version="1.0"?>
<root xmlns:AAAAAAAAAA...AAAAAAAAAA="http://example.com">
<AAAAAAAAAA...AAAAAAAAAA:element>Payload</AAAAAAAAAA...AAAAAAAAAA:element>
</root>
The parser allocates insufficient heap memory for the qualified name, writing beyond buffer boundaries. An attacker can corrupt adjacent heap structures to achieve code execution.
Risk Assessment:
- Web services accepting XML uploads: Critical
- SOAP API endpoints: Critical
- Internal XML processors: High (if processing untrusted data)
CVE-2026-86139: URI Escaping Resource Exhaustion (Ubuntu 26.04 LTS)
Severity: High
Attack Vector: Remote (malicious URI in XML)
Impact: Denial of Service
Platform: Ubuntu 26.04 LTS specifically
Technical Details:
libxml2’s URI escaping function uses an inefficient algorithm when processing large URI strings. A URI containing thousands of characters requiring escape sequences causes the function to consume excessive CPU and memory.
Exploitation Example:
<?xml version="1.0"?>
<root>
<include href="http://example.com/path?param=AAAA...AAAA¶m2=BBBB...BBBB"/>
</root>
Performance Impact:
- Normal URI (100 chars): <1ms processing time
- Malicious URI (10,000 chars): 30+ seconds, 500MB+ memory
Affected Services:
- Web crawlers processing XML sitemaps
- Feed aggregators parsing RSS/Atom with embedded URIs
- API gateways validating XML schemas with URI references
CVE-2026-86142: XPointer Expression Buffer Overflow
Discovered By: Xudong Cao and Meng Xu
Severity: Critical
Attack Vector: Remote (XPointer in XML)
Impact: RCE or DoS
Technical Details:
XPointer expressions (used for XML fragment identification) are parsed without proper length validation. An oversized XPointer expression causes a heap buffer overflow.
Exploitation Example:
<?xml version="1.0"?>
<root>
<xpointer>id('AAAA...AAAA[overflow_payload]')</xpointer>
</root>
Why This Matters:
XPointer is less commonly used than other XML features, potentially bypassing security awareness. Developers may not recognize XPointer-based payloads as threats.
CVE-2026-86143: Integer Overflow in Output Handling
Discovered By: Xudong Cao and Meng Xu
Severity: Medium
Attack Vector: Remote (large XML document)
Impact: DoS
Technical Details:
libxml2 fails to check for integer overflows when calculating output buffer sizes. A document with extremely large content causes an integer wrap-around, resulting in undersized buffer allocation and subsequent crash.
Exploitation Example:
Document size: 2^31 + 1 bytes (exceeds 32-bit signed integer max)
Calculated buffer size: 1 byte (due to integer overflow)
Result: Buffer overflow → segmentation fault
Detection Indicators:
- Crashes when processing large XML files (>2GB)
- Memory allocation failures in libxml2 output functions
- Inconsistent behavior with file size variations
CVE-2026-86144: Parser Security Option Bypass
Severity: High
Attack Vector: Remote (XXE/SSRF via XInclude)
Impact: XXE injection, SSRF, DoS
Technical Details:
Applications configure libxml2 to disable network access for security (preventing XXE/SSRF). However, when processing XInclude directives, libxml2 fails to enforce these restrictions. An attacker can include external resources regardless of parser configuration.
Exploitation Scenario:
<!-- Application sets: xmlParserSetFeature(parser, XML_PARSE_NONET, 1) -->
<!-- Attacker submits: -->
<?xml version="1.0"?>
<root>
<xi:include href="http://internal-server:8080/admin/config.xml"/>
<xi:include href="file:///etc/passwd"/>
</root>
Expected Behavior: Parser rejects external includes (NONET enabled)
Actual Behavior: Parser fetches resources, exposing internal data
Attack Chains:
- XXE Information Disclosure: Read
/etc/passwd, application source code - SSRF to Internal Services: Access internal APIs, databases, cloud metadata
- Denial of Service: Include billion laughs attack or external large files
Affected Configurations:
- Web services with “secure XML parsing” enabled
- API gateways filtering XXE attacks
- Document processors with network restrictions
Real-World Attack Scenarios
Remote Code Execution via Malicious XML Payloads
Scenario: E-commerce platform accepting product XML feeds from suppliers
1. Attacker registers as supplier, uploads crafted XML with oversized qualified names
2. Platform's libxml2 parser processes feed → heap buffer overflow
3. Attacker's shellcode executes in platform context
4. Attacker gains access to customer database, payment systems
Timeline: Minutes from upload to data breach
Mitigation Complexity: Requires immediate patching + input validation
XXE and SSRF Exploitation Through XInclude Bypass
Scenario: Document management system with “secure” XML processing
1. User uploads document with XInclude directives
2. System configured to prevent XXE (NONET option enabled)
3. CVE-2026-86144 bypass allows XInclude to fetch internal resources
4. Attacker reads:
- /etc/passwd (user enumeration)
- /var/www/config.php (database credentials)
- http://internal-api:5000/admin (internal service access)
5. Attacker pivots to internal network
Detection Difficulty: Legitimate XInclude usage masks malicious intent
Service Degradation Through Resource Exhaustion
Scenario: News aggregator processing RSS feeds
1. Attacker publishes RSS feed with malicious URI strings
2. Aggregator's libxml2 parser processes feed
3. CVE-2026-86139 triggers: URI escaping consumes 100% CPU
4. Service becomes unresponsive for legitimate users
5. Attacker repeats with multiple feeds → sustained DoS
Impact: Service unavailable for hours, revenue loss, reputation damage
Local Denial of Service via Crafted Catalogs
Scenario: System administrator running automated XML validation
1. Attacker places malformed catalog in shared directory
2. Validation script processes catalog → CVE-2026-76781 crash
3. Batch job fails, blocking downstream processes
4. Administrator manually restarts, unaware of attack
5. Attacker repeats daily, causing operational disruption
Severity Assessment and Risk Prioritization

Critical vs. High vs. Medium Severity Breakdown
Critical (Immediate Action Required):
- CVE-2026-86138 (Qualified Names Buffer Overflow)
- CVE-2026-86142 (XPointer Buffer Overflow)
Reason: Unauthenticated remote code execution via normal XML processing
High (Patch Within 24-48 Hours):
- CVE-2026-86139 (URI Escaping DoS)
- CVE-2026-86144 (Parser Option Bypass)
Reason: Significant availability/confidentiality impact; exploitable without authentication
Medium (Patch Within 1 Week):
- CVE-2026-76781 (Catalog Handling)
- CVE-2026-86143 (Integer Overflow)
Reason: Limited attack surface; requires specific conditions or local access
Impact on Confidentiality, Integrity, and Availability
| CVE | Confidentiality | Integrity | Availability |
|---|---|---|---|
| CVE-2026-86138 | Medium | High | High |
| CVE-2026-86139 | Low | Low | High |
| CVE-2026-86142 | Medium | High | High |
| CVE-2026-86144 | High | Medium | Medium |
| CVE-2026-76781 | Low | Low | Medium |
| CVE-2026-86143 | Low | Low | Medium |
Which Vulnerabilities Require Immediate Action
Tier 1 (Patch Today):
- Public-facing XML/SOAP services
- Document upload platforms
- API gateways processing XML
Tier 2 (Patch Within 48 Hours):
- Internal XML processors
- Log aggregation systems
- Configuration management tools
Tier 3 (Patch Within 1 Week):
- Development/testing environments
- Systems with strict change control
- Air-gapped systems with limited exposure
How to Detect Active Exploitation
Log Monitoring for Segmentation Faults and Crashes
What to Monitor:
# System logs
journalctl -u <service> | grep -i "segmentation\|core dump\|signal 11"
# Application logs
grep -r "libxml2\|XML parsing error\|Segmentation fault" /var/log/
# Kernel logs
dmesg | grep -i "segfault\|BUS\|ABRT"
Alert Thresholds:
- Single segfault: Investigate
- 3+ segfaults in 1 hour: Likely exploitation attempt
- Repeated crashes in same function: Probable attack
Example Alert Rule (ELK Stack):
{
"query": "message:segmentation AND process:libxml2",
"timeframe": "1h",
"threshold": 3,
"action": "alert"
}
Network Traffic Indicators of SSRF Attacks
Detection Patterns:
- Unexpected Outbound Connections:
Source: XML parsing service
Destination: Internal IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
Protocol: HTTP/HTTPS
Trigger: No legitimate reason for outbound connection
- Metadata Service Access (Cloud Environments):
Destination: 169.254.169.254 (AWS), 169.254.169.253 (GCP)
Indicator: Attacker attempting to steal cloud credentials
- Internal Service Probing:
Destination: Internal databases (5432, 3306, 27017)
Source: XML processing service
Indicator: Lateral movement attempt
WAF/Proxy Rules:
# Block XInclude directives in incoming XML
pattern: "xi:include|XInclude"
action: drop
# Monitor for suspicious href attributes
pattern: "href=\"(file://|http://.*internal|169.254)"
action: alert
CPU and Memory Anomalies Signaling Resource Exhaustion
Monitoring Metrics:
# Real-time process monitoring
watch -n 1 'ps aux | grep libxml2'
# Memory spike detection
sar -r 1 10 | grep -E "MemUsed|%memused"
# CPU utilization tracking
top -b -n 1 | grep libxml2
Alert Conditions:
- CPU usage: >80% for XML parsing service (baseline: <5%)
- Memory growth: >500MB in <1 minute
- Thread count: Sudden increase (indicates resource exhaustion)
Prometheus Metrics Example:
- alert: LibXML2ResourceExhaustion
expr: |
rate(process_cpu_seconds_total{job="xml_parser"}[5m]) > 0.8
AND
process_resident_memory_bytes{job="xml_parser"} > 500000000
for: 2m
annotations:
summary: "Possible CVE-2026-86139 exploitation"
WAF and Input Validation Inspection Techniques
XML Payload Analysis:
# Detect oversized qualified names
import xml.etree.ElementTree as ET
def check_qualified_names(xml_string):
for elem in ET.fromstring(xml_string).iter():
if len(elem.tag) > 1000: # Threshold
return "ALERT: Oversized qualified name"
return "OK"
# Detect XPointer expressions
if "xpointer" in xml_string.lower():
if len(xml_string) > 10000:
return "ALERT: Large XPointer expression"
# Detect XInclude directives
if "xi:include" in xml_string or "XInclude" in xml_string:
return "ALERT: XInclude detected - verify parser config"
WAF Rule Set:
| Rule | Pattern | Action |
|---|---|---|
| Oversized QName | <[a-z]+:[a-z]{1000,} |
Block |
| XPointer Injection | xpointer\(.*\) |
Block |
| XInclude Bypass | xi:include.*href |
Alert |
| URI Escaping DoS | href="[^"]{5000,}" |
Block |
Step-by-Step Mitigation and Patching
Applying USN-8910-1 Security Updates
For Ubuntu 26.04 LTS:
# Step 1: Update package lists
sudo apt-get update
# Step 2: Check available libxml2 version
apt-cache policy libxml2
# Step 3: Install security updates
sudo apt-get install --only-upgrade libxml2
# Step 4: Verify installation
dpkg -l | grep libxml2
xmllint --version
For Ubuntu 22.04 LTS / 20.04 LTS:
# Same process applies
sudo apt-get update
sudo apt-get install --only-upgrade libxml2 libxml2-dev
Verification:
# Confirm patched version
libxml2-config --version
# Expected output: 2.x.x (with patch level indicating USN-8910-1)
Service Restart Requirements and Downtime Planning
Services Requiring Restart:
# Identify services using libxml2
lsof | grep libxml2
# Common services
sudo systemctl restart apache2 # Web server
sudo systemctl restart nginx # Web server
sudo systemctl restart php-fpm # PHP processor
sudo systemctl restart logstash # Log aggregation
sudo systemctl restart elasticsearch # Search engine
sudo systemctl restart custom-app # Custom applications
Downtime Planning:
| Service | Restart Time | Impact | Recommendation |
|---|---|---|---|
| Apache/Nginx | 10-30 seconds | Brief connection drops | Off-peak window |
| PHP-FPM | 5-10 seconds | Minimal | During low traffic |
| Logstash | 30-60 seconds | Log processing delay | Coordinate with ops |
| Custom apps | Varies | Service unavailable | Schedule maintenance |
Zero-Downtime Approach (Load-Balanced Environments):
# 1. Remove server from load balancer
aws elb deregister-instances-from-load-balancer \
--load-balancer-name my-lb \
--instances i-1234567890abcdef0
# 2. Patch and restart
sudo apt-get update && sudo apt-get install --only-upgrade libxml2
sudo systemctl restart apache2
# 3. Health check
curl http://localhost/health
# 4. Re-add to load balancer
aws elb register-instances-with-load-balancer \
--load-balancer-name my-lb \
--instances i-1234567890abcdef0
# 5. Repeat for remaining servers
Input Sanitization Best Practices
Pre-Parsing Validation:
import xml.etree.ElementTree as ET
from xml.sax import parseString
from xml.sax.handler import ContentHandler
class SafeXMLValidator(ContentHandler):
MAX_ELEMENT_SIZE = 1000
MAX_ATTRIBUTE_SIZE = 500
MAX_DOCUMENT_SIZE = 10 * 1024 * 1024 # 10MB
def startElement(self, name, attrs):
# Check element name length
if len(name) > self.MAX_ELEMENT_SIZE:
raise ValueError(f"Element name too long: {len(name)}")
# Check attribute values
for attr_name, attr_value in attrs.items():
if len(attr_value) > self.MAX_ATTRIBUTE_SIZE:
raise ValueError(f"Attribute too long: {attr_name}")
# Block XInclude directives
if "xi:include" in attr_name.lower():
raise ValueError("XInclude not allowed")
# Block file:// URIs
if attr_value.startswith("file://"):
raise ValueError("File URIs not allowed")
def validate_xml(xml_string):
if len(xml_string) > SafeXMLValidator.MAX_DOCUMENT_SIZE:
raise ValueError("Document too large")
try:
parseString(xml_string, SafeXMLValidator())
return True
except Exception as e:
print(f"Validation failed: {e}")
return False
Application-Level Filtering:
# Flask example
from flask import Flask, request
import defusedxml.ElementTree as ET
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_xml():
xml_data = request.data
# Size check
if len(xml_data) > 10 * 1024 * 1024:
return "File too large", 413
try:
# Use defusedxml (XXE-safe parser)
root = ET.fromstring(xml_data)
# Process safely
return "OK", 200
except Exception as e:
return f"Invalid XML: {e}", 400
Network Egress Filtering for SSRF Prevention
Firewall Rules (iptables):
# Block outbound connections from XML processing service
# to internal networks (mitigates CVE-2026-86144 SSRF)
# Get UID of XML processing service
id -u xmlprocessor # e.g., 1001
# Block outbound to private networks
sudo iptables -A OUTPUT -m owner --uid-owner 1001 \
-d 10.0.0.0/8 -j REJECT
sudo iptables -A OUTPUT -m owner --uid-owner 1001 \
-d 172.16.0.0/12 -j REJECT
sudo iptables -A OUTPUT -m owner --uid-owner 1001 \
-d 192.168.0.0/16 -j REJECT
# Block metadata service (cloud environments)
sudo iptables -A OUTPUT -m owner --uid-owner 1001 \
-d 169.254.169.254 -j REJECT
# Save rules
sudo iptables-save > /etc/iptables/rules.v4
UFW (Ubuntu Firewall):
# Deny outbound from XML service to internal networks
sudo ufw route deny out from any to 10.0.0.0/8
sudo ufw route deny out from any to 172.16.0.0/12
sudo ufw route deny out from any to 192.168.0.0/16
Application-Level Restrictions:
# Disable network access in libxml2
import libxml2
# Disable network I/O
libxml2.xmlSetFeature("network", False)
# Disable external entity loading
libxml2.xmlSetFeature("external_entity", False)
# Disable XInclude processing
libxml2.xmlSetFeature("xinclude", False)
Verification and Post-Patch Validation
Confirming libxml2 Version After Update
Check Installed Version:
# Method 1: Package manager
dpkg -l | grep libxml2
# Output: ii libxml2 2.x.x-x~ubuntu0.26.04.1
# Method 2: Library version
ldconfig -p | grep libxml2
# Output: libxml2.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libxml2.so.2
# Method 3: Command-line tool
xmllint --version
# Output: xmllint: using libxml version 20x0x
Verify Patch Applied:
# Check security update log
apt-get changelog libxml2 | head -20
# Confirm USN-8910-1 in changelog
grep -i "USN-8910-1" /var/log/apt/history.log
Testing XML Processing Functionality
Basic Functionality Test:
# Create test XML
cat > test.xml << 'EOF'
<?xml version="1.0"?>
<root>
<element attr="value">Content</element>
</root>
EOF
# Parse with xmllint
xmllint --noout test.xml
echo "Exit code: $?" # Should be 0
# Test with Python
python3 << 'EOF'
import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
print(f"Root tag: {root.tag}")
print("XML parsing: OK")
EOF
Security Feature Validation:
# Test XXE prevention
import xml.etree.ElementTree as ET
xxe_payload = """<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>"""
try:
ET.fromstring(xxe_payload)
print("WARNING: XXE not prevented!")
except Exception as e:
print(f"XXE prevention: OK ({e})")
# Test XInclude blocking
xinclude_payload = """<?xml version="1.0"?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="file:///etc/passwd"/>
</root>"""
try:
ET.fromstring(xinclude_payload)
print("XInclude processing: OK")
except Exception as e:
print(f"XInclude handling: {e}")
Monitoring for Regression Issues
Application Health Checks:
# Monitor error rates post-patch
curl -s http://localhost/api/health | jq '.status'
# Check application logs for new errors
tail -f /var/log/application.log | grep -i "error\|exception"
# Monitor resource usage
watch -n 5 'free -h && ps aux | grep app'
Automated Regression Testing:
#!/bin/bash
# post-patch-validation.sh
echo "=== Post-Patch Validation ==="
# 1. Service availability
for service in apache2 php-fpm logstash; do
if systemctl is-active --quiet $service; then
echo "✓ $service running"
else
echo "✗ $service NOT running"
exit 1
fi
done
# 2. XML processing
if xmllint --noout test.xml 2>/dev/null; then
echo "✓ XML parsing functional"
else
echo "✗ XML parsing failed"
exit 1
fi
# 3. Performance baseline
time xmllint --noout large_file.xml
# Compare with pre-patch baseline
# 4. Security features
if python3 test_security.py; then
echo "✓ Security features intact"
else
echo "✗ Security regression detected"
exit 1
fi
echo "=== Validation Complete ==="
Long-Term Security Hardening
Disabling Unnecessary XML Features
Reduce Attack Surface:
# Disable features not required by application
import libxml2
# Disable network I/O (prevents SSRF)
libxml2.xmlSetFeature("network", False)
# Disable external entity loading (prevents XXE)
libxml2.xmlSetFeature("external_entity", False)
# Disable XInclude processing (prevents CVE-2026-86144)
libxml2.xmlSetFeature("xinclude", False)
# Disable DTD processing (prevents billion laughs)
libxml2.xmlSetFeature("dtd", False)
Application Configuration:
<!-- Spring XML configuration example -->
<bean id="xmlParser" class="org.springframework.xml.transform.TransformerFactoryBean">
<property name="features">
<map>
<entry key="http://apache.org/xml/features/disallow-doctype-decl" value="true"/>
<entry key="http://xml.org/sax/features/external-general-entities" value="false"/>
<entry key="http://xml.org/sax/features/external-parameter-entities" value="false"/>
<entry key="http://apache.org/xml/features/nonvalidating/load-external-dtd" value="false"/>
</map>
</property>
</bean>
Implementing Defense-in-Depth Strategies
Layered Security Approach:
Layer 1: Input Validation
├─ Size limits (max 10MB)
├─ Schema validation
└─ Malicious pattern detection
Layer 2: Parser Hardening
├─ Disable unnecessary features
├─ Set resource limits
└─ Use safe parsing libraries
Layer 3: Network Isolation
├─ Egress filtering
├─ Internal network segmentation
└─ Metadata service blocking
Layer 4: Monitoring & Response
├─ Log analysis
├─ Anomaly detection
└─ Incident response procedures
Implementation Example:
from defusedxml import ElementTree as ET
from xml.sax import parseString
import logging
class SecureXMLProcessor:
MAX_SIZE = 10 * 1024 * 1024
TIMEOUT = 30
def __init__(self):
self.logger = logging.getLogger(__name__)
def process(self, xml_data):
# Layer 1: Input validation
if len(xml_data) > self.MAX_SIZE:
self.logger.warning("XML size exceeds limit")
raise ValueError("Document too large")
# Layer 2: Safe parsing
try:
root = ET.fromstring(xml_data)
self.logger.info("XML parsed successfully")
return root
except Exception as e:
self.logger.error(f"XML parsing failed: {e}")
raise
# Layer 3: Network isolation handled by firewall
# Layer 4: Logging and monitoring in place
Continuous Vulnerability Scanning
Automated Scanning Schedule:
#!/bin/bash
# weekly-vuln-scan.sh
# Scan for vulnerable libxml2 versions
apt list --upgradable | grep libxml2
# Check for known CVEs
debsecan --suite focal --only-fixed | grep libxml2
# SBOM analysis
syft packages -o json > sbom.json
grype sbom.json --fail-on high
Integration with CI/CD:
# .gitlab-ci.yml example
security_scan:
stage: test
script:
- apt-get update
- apt-cache policy libxml2
- |
VERSION=$(apt-cache policy libxml2 | grep Candidate | awk '{print $2}')
if [[ "$VERSION" == *"USN-8910-1"* ]]; then
echo "✓ Patched version detected"
else
echo "✗ Vulnerable version detected"
exit 1
fi
only:
- merge_requests
Dependency Tracking:
“`bash
Generate software bill of materials
cyclonedx-bom -o sbom.xml
Monitor for new CVEs
trivy image myapp:latest –severity HIGH,CRITICAL