diff --git a/src/todo/rust-basics.md b/src/todo/rust-basics.md index 82739fe55..0a9549bf8 100644 --- a/src/todo/rust-basics.md +++ b/src/todo/rust-basics.md @@ -32,7 +32,7 @@ Some(T), ### मैक्रोज़ -मैक्रोज़ फ़ंक्शंस की तुलना में अधिक शक्तिशाली होते हैं क्योंकि ये उस कोड को उत्पन्न करने के लिए विस्तारित होते हैं जो आपने मैन्युअल रूप से लिखा है। उदाहरण के लिए, एक फ़ंक्शन सिग्नेचर को फ़ंक्शन के पास मौजूद पैरामीटर की संख्या और प्रकार को घोषित करना चाहिए। दूसरी ओर, मैक्रोज़ एक परिवर्तनीय संख्या में पैरामीटर ले सकते हैं: हम `println!("hello")` को एक तर्क के साथ या `println!("hello {}", name)` को दो तर्कों के साथ कॉल कर सकते हैं। इसके अलावा, मैक्रोज़ कोड के अर्थ की व्याख्या करने से पहले विस्तारित होते हैं, इसलिए एक मैक्रो, उदाहरण के लिए, एक दिए गए प्रकार पर एक trait को लागू कर सकता है। एक फ़ंक्शन ऐसा नहीं कर सकता, क्योंकि इसे रनटाइम पर कॉल किया जाता है और एक trait को संकलन समय पर लागू किया जाना चाहिए। +मैक्रोज़ फ़ंक्शंस की तुलना में अधिक शक्तिशाली होते हैं क्योंकि वे उस कोड को उत्पन्न करने के लिए विस्तारित होते हैं जो आपने मैन्युअल रूप से लिखा है। उदाहरण के लिए, एक फ़ंक्शन सिग्नेचर को फ़ंक्शन के पास मौजूद पैरामीटर की संख्या और प्रकार को घोषित करना चाहिए। दूसरी ओर, मैक्रोज़ एक परिवर्तनशील संख्या में पैरामीटर ले सकते हैं: हम `println!("hello")` को एक तर्क के साथ या `println!("hello {}", name)` को दो तर्कों के साथ कॉल कर सकते हैं। इसके अलावा, मैक्रोज़ कोड के अर्थ की व्याख्या करने से पहले विस्तारित होते हैं, इसलिए एक मैक्रो, उदाहरण के लिए, एक दिए गए प्रकार पर एक trait लागू कर सकता है। एक फ़ंक्शन ऐसा नहीं कर सकता, क्योंकि इसे रनटाइम पर कॉल किया जाता है और एक trait को संकलन समय पर लागू किया जाना चाहिए। ```rust macro_rules! my_macro { () => { @@ -74,7 +74,7 @@ for (key, hashvalue) in &*map { for key in map.keys() { for value in map.values() { ``` -### पुनरावर्ती बॉक्स +### पुनरावृत्त बॉक्स ```rust enum List { Cons(i32, List), @@ -256,7 +256,7 @@ assert_ne!(true, false); #### आर्क -एक Arc Clone का उपयोग करके वस्तु पर अधिक संदर्भ बनाने के लिए उपयोग कर सकता है ताकि उन्हें थ्रेड्स को पास किया जा सके। जब किसी मान के लिए अंतिम संदर्भ पॉइंटर स्कोप से बाहर होता है, तो चर हटा दिया जाता है। +एक आर्क Clone का उपयोग करके ऑब्जेक्ट पर अधिक संदर्भ बनाने के लिए उपयोग कर सकता है ताकि उन्हें थ्रेड्स को पास किया जा सके। जब किसी मान के लिए अंतिम संदर्भ पॉइंटर स्कोप से बाहर होता है, तो वेरिएबल हटा दिया जाता है। ```rust use std::sync::Arc; let apple = Arc::new("the same apple"); @@ -287,4 +287,71 @@ thread::sleep(Duration::from_millis(500)); } } ``` +### सुरक्षा आवश्यकताएँ + +Rust डिफ़ॉल्ट रूप से मजबूत मेमोरी-सुरक्षा गारंटी प्रदान करता है, लेकिन आप अभी भी `unsafe` कोड, निर्भरता मुद्दों या लॉजिक गलतियों के माध्यम से महत्वपूर्ण कमजोरियाँ पेश कर सकते हैं। निम्नलिखित मिनी-चीटशीट उन प्राइमिटिव्स को इकट्ठा करती है जिनसे आप आमतौर पर Rust सॉफ़्टवेयर की आक्रामक या रक्षात्मक सुरक्षा समीक्षाओं के दौरान संपर्क करेंगे। + +#### Unsafe कोड और मेमोरी सुरक्षा + +`unsafe` ब्लॉक्स कंपाइलर के एलियासिंग और बाउंड्स चेक से बाहर निकलते हैं, इसलिए **सभी पारंपरिक मेमोरी-करप्शन बग (OOB, उपयोग के बाद मुक्त, डबल फ्री, आदि) फिर से प्रकट हो सकते हैं**। एक त्वरित ऑडिट चेकलिस्ट: + +* `unsafe` ब्लॉक्स, `extern "C"` फ़ंक्शंस, `ptr::copy*`, `std::mem::transmute`, `MaybeUninit`, कच्चे पॉइंटर्स या `ffi` मॉड्यूल के लिए देखें। +* निम्न-स्तरीय फ़ंक्शंस को पास किए गए प्रत्येक पॉइंटर अंकगणित और लंबाई तर्क को मान्य करें। +* जब कोई `unsafe` को फिर से पेश करता है तो संकलन विफल करने के लिए `#![forbid(unsafe_code)]` (क्रेट-व्यापी) या `#[deny(unsafe_op_in_unsafe_fn)]` (1.68 +) को प्राथमिकता दें। + +कच्चे पॉइंटर्स के साथ बनाए गए ओवरफ्लो का उदाहरण: +```rust +use std::ptr; + +fn vuln_copy(src: &[u8]) -> Vec { +let mut dst = Vec::with_capacity(4); +unsafe { +// ❌ copies *src.len()* bytes, the destination only reserves 4. +ptr::copy_nonoverlapping(src.as_ptr(), dst.as_mut_ptr(), src.len()); +dst.set_len(src.len()); +} +dst +} +``` +Miri चलाना परीक्षण के समय UB का पता लगाने का एक सस्ता तरीका है: +```bash +rustup component add miri +cargo miri test # hunts for OOB / UAF during unit tests +``` +#### Auditing dependencies with RustSec / cargo-audit + +अधिकांश वास्तविक दुनिया के Rust कमजोरियाँ तृतीय-पक्ष क्रेट्स में होती हैं। RustSec सलाहकार DB (समुदाय द्वारा संचालित) को स्थानीय रूप से क्वेरी किया जा सकता है: +```bash +cargo install cargo-audit +cargo audit # flags vulnerable versions listed in Cargo.lock +``` +इसे CI में एकीकृत करें और `--deny warnings` पर विफल हों। + +`cargo deny check advisories` समान कार्यक्षमता प्रदान करता है, साथ ही लाइसेंस और प्रतिबंध सूची की जांच भी करता है। + +#### सप्लाई-चेन सत्यापन cargo-vet के साथ (2024) + +`cargo vet` आपके द्वारा आयात किए गए प्रत्येक क्रेट के लिए एक समीक्षा हैश रिकॉर्ड करता है और अनजान अपग्रेड को रोकता है: +```bash +cargo install cargo-vet +cargo vet init # generates vet.toml +cargo vet --locked # verifies packages referenced in Cargo.lock +``` +यह उपकरण Rust प्रोजेक्ट इन्फ्रास्ट्रक्चर और बढ़ती संख्या के संगठनों द्वारा विषाक्त-पैकेज हमलों को कम करने के लिए अपनाया जा रहा है। + +#### अपने API सतह को फज़ करना (cargo-fuzz) + +फज़ परीक्षण आसानी से पैनिक, पूर्णांक ओवरफ्लो और लॉजिक बग्स को पकड़ लेते हैं जो DoS या साइड-चैनल मुद्दे बन सकते हैं: +```bash +cargo install cargo-fuzz +cargo fuzz init # creates fuzz_targets/ +cargo fuzz run fuzz_target_1 # builds with libFuzzer & runs continuously +``` +अपने रिपॉजिटरी में फज़ टारगेट जोड़ें और इसे अपनी पाइपलाइन में चलाएँ। + +## संदर्भ + +- RustSec सलाहकार डेटाबेस – +- Cargo-vet: "अपने Rust निर्भरताओं का ऑडिट करना" – + {{#include ../banners/hacktricks-training.md}}