
एक वेब सर्वर में Rust use-after-free का प्रदर्शन करता है, जिसमें असुरक्षित कोड और एक मल्टीथ्रेडेड ट्रिगर शामिल है, जो मेमोरी भ्रष्टाचार और संभावित कोड निष्पादन को दर्शाता है।
// uaf_server.rs - Vulnerable Rust HTTP server with use-after-free
use std::sync::{Arc, Mutex};
use std::thread;
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
struct SharedBuffer {
data: Vec<u8>,
}
impl SharedBuffer {
fn new() -> Self { SharedBuffer { data: vec![0; 1024] } }
}
fn handle_client(mut stream: TcpStream, buffer: Arc<Mutex<SharedBuffer>>) {
// Simulate reading request and writing response.
let mut buf = [0; 512];
stream.read(&mut buf).unwrap();
let b = buffer.lock().unwrap();
let ptr = b.data.as_ptr() as *mut u8; // raw pointer
// Drop the lock early? In unsafe block we might send the pointer to another thread.
// Here we simulate a bug: the SharedBuffer is dropped, but we later use the pointer.
drop(b);
// After lock is released, another thread could replace the Vec, freeing the old allocation.
// Unsafe write through the dangling pointer.
unsafe {
*ptr = 42; // use after free!
}
stream.write(b"HTTP/1.1 200 OK\r\n\r\nHello").unwrap();
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
let buffer = Arc::new(Mutex::new(SharedBuffer::new()));
for stream in listener.incoming() {
let stream = stream.unwrap();
let buf_clone = Arc::clone(&buffer);
thread::spawn(move || {
handle_client(stream, buf_clone);
});
}
}
एक Rust वेब सर्वर थ्रेड्स के बीच बफ़र साझा करने के लिए असुरक्षित कोड का उपयोग करता है। एक रेस कंडीशन के कारण use‑after‑free उत्पन्न होती है, जो संभावित रूप से मेमोरी भ्रष्टाचार या सूचना प्रकटीकरण का कारण बन सकती है।
Vec से कच्चा पॉइंटर प्राप्त किया जाता है, लॉक हटा दिया जाता है, और वेक्टर को किसी अन्य थ्रेड द्वारा प्रतिस्थापित कर दिया जाता है, जिससे पॉइंटर के उपयोग में रहते हुए मेमोरी मुक्त हो जाती है।rustc uaf_server.rs
./uaf_server
python trigger_uaf.py