From da3f08028dda3b6f906f94ef19fabb316b5a16c4 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 12 Jul 2025 11:25:53 +0000 Subject: [PATCH] Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/ --- .../0.-basic-llm-concepts.md | 60 ++++---- src/AI/AI-llm-architecture/1.-tokenizing.md | 92 +++++------ .../AI-llm-architecture/2.-data-sampling.md | 12 +- .../3.-token-embeddings.md | 28 ++-- .../4.-attention-mechanisms.md | 46 +++--- .../5.-llm-architecture.md | 46 +++--- .../6.-pre-training-and-loading-models.md | 58 +++---- .../7.0.-lora-improvements-in-fine-tuning.md | 6 +- .../7.1.-fine-tuning-for-classification.md | 22 +-- ...7.2.-fine-tuning-to-follow-instructions.md | 26 ++-- src/AI/AI-llm-architecture/README.md | 14 +- .../arbitrary-write-2-exec/README.md | 4 +- .../aw2exec-sips-icc-profile.md | 8 +- src/binary-exploitation/array-indexing.md | 4 +- .../bf-forked-stack-canaries.md | 22 +-- src/binary-exploitation/ios-exploiting.md | 31 ++-- src/binary-exploitation/libc-heap/README.md | 42 ++--- .../libc-heap/use-after-free/first-fit.md | 18 +-- .../discord-invite-hijacking.md | 28 ++-- .../threat-modeling.md | 16 +- .../macos-dangerous-entitlements.md | 32 ++-- .../android-app-pentesting/flutter.md | 20 +-- .../ios-pentesting-without-jailbreak.md | 28 ++-- .../1414-pentesting-ibmmq.md | 32 ++-- .../pentesting-ntp.md | 24 +-- .../pentesting-web/angular.md | 70 ++++----- .../pentesting-web/django.md | 30 ++-- .../pentesting-web/laravel.md | 43 +++--- .../pentesting-web/nodejs-express.md | 6 +- .../pentesting-web/spring-actuators.md | 7 +- .../dapps-DecentralizedApplications.md | 26 ++-- .../lfi2rce-via-nginx-temp-files.md | 6 +- src/pentesting-web/idor.md | 30 ++-- .../xss-cross-site-scripting/README.md | 144 +++++++++--------- .../fault_injection_attacks.md | 8 +- .../hardware-hacking/side_channel_analysis.md | 6 +- .../README.md | 8 +- .../modbus.md | 14 +- src/todo/investment-terms.md | 8 +- src/todo/radio-hacking/README.md | 2 +- .../radio-hacking/fissure-the-rf-framework.md | 48 +++--- .../low-power-wide-area-network.md | 89 ++++++++++- src/todo/rust-basics.md | 10 +- src/todo/test-llms.md | 23 +-- .../TimeRoasting.md | 14 +- .../printnightmare.md | 95 +++++++++++- src/windows-hardening/cobalt-strike.md | 82 +++++----- 47 files changed, 823 insertions(+), 665 deletions(-) diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index e13f5d04d..56a71b6e2 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,24 +1,24 @@ -# 0. Basic LLM Concepts +# 0. Basis LLM Konsepte -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} -## Pretraining +## Vooropleiding -Pretraining is die grondslag fase in die ontwikkeling van 'n groot taalmodel (LLM) waar die model blootgestel word aan groot en diverse hoeveelhede teksdata. Tydens hierdie fase, **leer die LLM die fundamentele strukture, patrone, en nuanses van taal**, insluitend grammatika, woordeskat, sintaksis, en kontekstuele verhoudings. Deur hierdie uitgebreide data te verwerk, verkry die model 'n breë begrip van taal en algemene wêreldkennis. Hierdie omvattende basis stel die LLM in staat om samehangende en kontekstueel relevante teks te genereer. Vervolgens kan hierdie vooropgeleide model fyn-afgestem word, waar dit verder opgelei word op gespesialiseerde datastelle om sy vermoëns aan te pas vir spesifieke take of domeine, wat sy prestasie en relevansie in geteikende toepassings verbeter. +Vooropleiding is die grondleggende fase in die ontwikkeling van 'n groot taalmodel (LLM) waar die model blootgestel word aan groot en diverse hoeveelhede teksdata. Tydens hierdie fase, **leer die LLM die fundamentele strukture, patrone en nuanses van taal**, insluitend grammatika, woordeskat, sintaksis en kontekstuele verhoudings. Deur hierdie uitgebreide data te verwerk, verwerf die model 'n breë begrip van taal en algemene wêreldkennis. Hierdie omvattende basis stel die LLM in staat om samehangende en kontekstueel relevante teks te genereer. Daarna kan hierdie vooropgeleide model verder fyn-afgestem word, waar dit verder opgelei word op gespesialiseerde datastelle om sy vermoëns aan te pas vir spesifieke take of domeine, wat sy prestasie en relevansie in geteikende toepassings verbeter. -## Main LLM components +## Hoof LLM komponente Gewoonlik word 'n LLM gekarakteriseer deur die konfigurasie wat gebruik word om dit op te lei. Dit is die algemene komponente wanneer 'n LLM opgelei word: - **Parameters**: Parameters is die **leerbare gewigte en vooroordele** in die neurale netwerk. Dit is die getalle wat die opleidingsproses aanpas om die verliesfunksie te minimaliseer en die model se prestasie op die taak te verbeter. LLMs gebruik gewoonlik miljoene parameters. -- **Context Length**: Dit is die maksimum lengte van elke sin wat gebruik word om die LLM voor te oefen. -- **Embedding Dimension**: Die grootte van die vektor wat gebruik word om elke token of woord voor te stel. LLMs gebruik gewoonlik miljarde dimensies. -- **Hidden Dimension**: Die grootte van die verborge lae in die neurale netwerk. -- **Number of Layers (Depth)**: Hoeveel lae die model het. LLMs gebruik gewoonlik tientalle lae. -- **Number of Attention Heads**: In transformer modelle, is dit hoeveel aparte aandag meganismes in elke laag gebruik word. LLMs gebruik gewoonlik tientalle koppe. -- **Dropout**: Dropout is iets soos die persentasie data wat verwyder word (waarskynlikhede draai na 0) tydens opleiding wat gebruik word om **oorpassing te voorkom.** LLMs gebruik gewoonlik tussen 0-20%. +- **Kontekslengte**: Dit is die maksimum lengte van elke sin wat gebruik word om die LLM voor te oefen. +- **Inbedigingsdimensie**: Die grootte van die vektor wat gebruik word om elke token of woord voor te stel. LLMs gebruik gewoonlik biljoene dimensies. +- **Verborge Dimensie**: Die grootte van die verborge lae in die neurale netwerk. +- **Aantal Lae (Diepte)**: Hoeveel lae die model het. LLMs gebruik gewoonlik tientalle lae. +- **Aantal Aandagkoppe**: In transformermodelle, dit is hoeveel aparte aandagmeganismes in elke laag gebruik word. LLMs gebruik gewoonlik tientalle koppe. +- **Dropout**: Dropout is iets soos die persentasie data wat verwyder word (waarskynlikhede word 0) tydens opleiding wat gebruik word om **oorpassing te voorkom.** LLMs gebruik gewoonlik tussen 0-20%. -Configuration of the GPT-2 model: +Konfigurasie van die GPT-2 model: ```json GPT_CONFIG_124M = { "vocab_size": 50257, // Vocabulary size of the BPE tokenizer @@ -32,25 +32,25 @@ GPT_CONFIG_124M = { ``` ## Tensors in PyTorch -In PyTorch, 'n **tensor** is 'n fundamentele datastruktuur wat dien as 'n multi-dimensionele array, wat konsepte soos skalar, vektore en matrikse veralgemeen na moontlik hoër dimensies. Tensors is die primêre manier waarop data voorgestel en gemanipuleer word in PyTorch, veral in die konteks van diep leer en neurale netwerke. +In PyTorch, 'n **tensor** is 'n fundamentele datastruktuur wat dien as 'n multi-dimensionele array, wat konsepte soos skalars, vektore en matrikse veralgemeen na moontlik hoër dimensies. Tensors is die primêre manier waarop data voorgestel en gemanipuleer word in PyTorch, veral in die konteks van diep leer en neurale netwerke. -### Mathematical Concept of Tensors +### Wiskundige Konsep van Tensors -- **Scalars**: Tensors van rang 0, wat 'n enkele getal voorstel (nul-dimensioneel). Soos: 5 -- **Vectors**: Tensors van rang 1, wat 'n een-dimensionele array van getalle voorstel. Soos: \[5,1] -- **Matrices**: Tensors van rang 2, wat twee-dimensionele arrays met rye en kolomme voorstel. Soos: \[\[1,3], \[5,2]] -- **Higher-Rank Tensors**: Tensors van rang 3 of meer, wat data in hoër dimensies voorstel (bv. 3D tensors vir kleurbeelde). +- **Skalars**: Tensors van rang 0, wat 'n enkele getal voorstel (nul-dimensioneel). Soos: 5 +- **Vektore**: Tensors van rang 1, wat 'n een-dimensionele array van getalle voorstel. Soos: \[5,1] +- **Matrikse**: Tensors van rang 2, wat twee-dimensionele arrays met rye en kolomme voorstel. Soos: \[\[1,3], \[5,2]] +- **Hoër-Rang Tensors**: Tensors van rang 3 of meer, wat data in hoër dimensies voorstel (bv. 3D tensors vir kleurbeelde). ### Tensors as Data Containers -From a computational perspective, tensors act as containers for multi-dimensional data, where each dimension can represent different features or aspects of the data. This makes tensors highly suitable for handling complex datasets in machine learning tasks. +Vanuit 'n rekenkundige perspektief, funksioneer tensors as houers vir multi-dimensionele data, waar elke dimensie verskillende kenmerke of aspekte van die data kan voorstel. Dit maak tensors hoogs geskik vir die hantering van komplekse datasets in masjienleer take. ### PyTorch Tensors vs. NumPy Arrays -While PyTorch tensors are similar to NumPy arrays in their ability to store and manipulate numerical data, they offer additional functionalities crucial for deep learning: +Terwyl PyTorch tensors soortgelyk is aan NumPy arrays in hul vermoë om numeriese data te stoor en te manipuleer, bied hulle addisionele funksionaliteite wat noodsaaklik is vir diep leer: -- **Automatic Differentiation**: PyTorch tensors support automatic calculation of gradients (autograd), which simplifies the process of computing derivatives required for training neural networks. -- **GPU Acceleration**: Tensors in PyTorch can be moved to and computed on GPUs, significantly speeding up large-scale computations. +- **Outomatiese Differensiasie**: PyTorch tensors ondersteun outomatiese berekening van gradiënte (autograd), wat die proses van die berekening van afgeleides wat benodig word vir die opleiding van neurale netwerke vereenvoudig. +- **GPU Versnelling**: Tensors in PyTorch kan na en op GPU's beweeg en bereken word, wat groot-skaal berekeninge aansienlik versnel. ### Creating Tensors in PyTorch @@ -72,11 +72,11 @@ tensor2d = torch.tensor([[1, 2], tensor3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) ``` -### Tensor Gegewens Tipes +### Tensor Data Tipes PyTorch tensors kan data van verskillende tipes stoor, soos heelgetalle en drijvende-komma getalle. -Jy kan 'n tensor se gegewens tipe nagaan met die `.dtype` attribuut: +Jy kan 'n tensor se datatipe nagaan met die `.dtype` attribuut: ```python tensor1d = torch.tensor([1, 2, 3]) print(tensor1d.dtype) # Output: torch.int64 @@ -96,7 +96,7 @@ PyTorch bied 'n verskeidenheid operasies om tensors te manipuleer: - **Toegang tot Vorm**: Gebruik `.shape` om die dimensies van 'n tensor te kry. ```python -print(tensor2d.shape) # Output: torch.Size([2, 2]) +print(tensor2d.shape) # Uitset: torch.Size([2, 2]) ``` - **Hervorming van Tensors**: Gebruik `.reshape()` of `.view()` om die vorm te verander. @@ -192,7 +192,7 @@ loss.backward() print("Gradient w.r.t w:", w.grad) print("Gradient w.r.t b:", b.grad) ``` -**Output:** +**Translation:** ```css cssCopy codeGradient w.r.t w: tensor([-0.0898]) Gradient w.r.t b: tensor([-0.0817]) @@ -203,14 +203,14 @@ Gradient w.r.t b: tensor([-0.0817]) In groter neurale netwerke met meerdere lae, word die proses om gradiënte te bereken meer kompleks weens die verhoogde aantal parameters en operasies. Tog bly die fundamentele beginsels dieselfde: -- **Voorwaartse Deur:** Bereken die uitvoer van die netwerk deur insette deur elke laag te laat gaan. +- **Voorwaartse Deurloop:** Bereken die uitvoer van die netwerk deur insette deur elke laag te laat gaan. - **Bereken Verlies:** Evalueer die verliesfunksie met behulp van die netwerk se uitvoer en die teikenetikette. -- **Achterwaartse Deur (Terugpropagering):** Bereken die gradiënte van die verlies ten opsigte van elke parameter in die netwerk deur die kettingreël herhaaldelik toe te pas van die uitvoerlaag terug na die insetlaag. +- **Achterwaartse Deurloop (Terugpropagering):** Bereken die gradiënte van die verlies ten opsigte van elke parameter in die netwerk deur die kettingreël herhaaldelik toe te pas van die uitvoerlaag terug na die insetlaag. ### **2. Terugpropagering Algoritme** - **Stap 1:** Begin die netwerkparameters (gewigte en vooroordele). -- **Stap 2:** Vir elke opleidingsvoorbeeld, voer 'n voorwaartse deur uit om die uitvoer te bereken. +- **Stap 2:** Vir elke opleidingsvoorbeeld, voer 'n voorwaartse deurloop uit om die uitvoer te bereken. - **Stap 3:** Bereken die verlies. - **Stap 4:** Bereken die gradiënte van die verlies ten opsigte van elke parameter met behulp van die kettingreël. - **Stap 5:** Werk die parameters op met 'n optimalisering algoritme (bv. gradiëntafname). @@ -286,4 +286,4 @@ Tydens die agterwaartse deurloop: - **Nauwkeurigheid:** Verskaf presiese afgeleides tot masjienpresisie. - **Gebruiksgemak:** Elimineer handmatige berekening van afgeleides. -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index 56959182b..ffaca8c47 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,79 +1,79 @@ # 1. Tokenizing -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Tokenizing -**Tokenizing** is die proses om data, soos teks, op te breek in kleiner, hanteerbare stukke wat _tokens_ genoem word. Elke token word dan aan 'n unieke numeriese identifiseerder (ID) toegeken. Dit is 'n fundamentele stap in die voorbereiding van teks vir verwerking deur masjienleer modelle, veral in natuurlike taalverwerking (NLP). +**Tokenizing** is die proses om data, soos teks, in kleiner, hanteerbare stukke genaamd _tokens_ op te breek. Elke token word dan aan 'n unieke numeriese identifiseerder (ID) toegeken. Dit is 'n fundamentele stap in die voorbereiding van teks vir verwerking deur masjienleer modelle, veral in natuurlike taalverwerking (NLP). > [!TIP] > Die doel van hierdie aanvanklike fase is baie eenvoudig: **Verdeel die invoer in tokens (ids) op 'n manier wat sin maak**. -### **How Tokenizing Works** +### **Hoe Tokenizing Werk** -1. **Splitting the Text:** -- **Basic Tokenizer:** 'n Eenvoudige tokenizer kan teks in individuele woorde en leestekens verdeel, terwyl spaties verwyder word. -- _Example:_\ +1. **Die Teks Verdeeld:** +- **Basiese Tokenizer:** 'n Eenvoudige tokenizer kan teks in individuele woorde en leestekens verdeel, terwyl spaties verwyder word. +- _Voorbeeld:_\ Teks: `"Hello, world!"`\ Tokens: `["Hello", ",", "world", "!"]` -2. **Creating a Vocabulary:** -- Om tokens in numeriese ID's om te skakel, word 'n **vocabulary** geskep. Hierdie vocabulary lys al die unieke tokens (woorde en simbole) en ken elkeen 'n spesifieke ID toe. -- **Special Tokens:** Dit is spesiale simbole wat by die vocabulary gevoeg word om verskillende scenario's te hanteer: -- `[BOS]` (Beginning of Sequence): Dui die begin van 'n teks aan. -- `[EOS]` (End of Sequence): Dui die einde van 'n teks aan. -- `[PAD]` (Padding): Gebruik om alle reekse in 'n batch dieselfde lengte te maak. -- `[UNK]` (Unknown): Verteenwoordig tokens wat nie in die vocabulary is nie. -- _Example:_\ +2. **Skep 'n Woordeskat:** +- Om tokens in numeriese ID's om te skakel, word 'n **woordeskat** geskep. Hierdie woordeskat lys al die unieke tokens (woorde en simbole) en ken elkeen 'n spesifieke ID toe. +- **Spesiale Tokens:** Dit is spesiale simbole wat by die woordeskat gevoeg word om verskillende scenario's te hanteer: +- `[BOS]` (Begin van Sequentie): Dui die begin van 'n teks aan. +- `[EOS]` (Einde van Sequentie): Dui die einde van 'n teks aan. +- `[PAD]` (Padding): Gebruik om alle sequenties in 'n batch dieselfde lengte te maak. +- `[UNK]` (Onbekend): Verteenwoordig tokens wat nie in die woordeskat is nie. +- _Voorbeeld:_\ As `"Hello"` ID `64` toegeken word, `","` is `455`, `"world"` is `78`, en `"!"` is `467`, dan:\ `"Hello, world!"` → `[64, 455, 78, 467]` -- **Handling Unknown Words:**\ -As 'n woord soos `"Bye"` nie in die vocabulary is nie, word dit vervang met `[UNK]`.\ +- **Hanteer Onbekende Woorde:**\ +As 'n woord soos `"Bye"` nie in die woordeskat is nie, word dit vervang met `[UNK]`.\ `"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\ _(Aneem `[UNK]` het ID `987`)_ -### **Advanced Tokenizing Methods** +### **Geavanceerde Tokenizing Metodes** -Terwyl die basiese tokenizer goed werk vir eenvoudige teks, het dit beperkings, veral met groot vocabularies en die hantering van nuwe of seldsame woorde. Gevorderde tokenizing metodes spreek hierdie probleme aan deur teks in kleiner subeenhede op te breek of die tokenisering proses te optimaliseer. +Terwyl die basiese tokenizer goed werk vir eenvoudige teks, het dit beperkings, veral met groot woordeskatte en die hantering van nuwe of seldsame woorde. Geavanceerde tokenizing metodes spreek hierdie probleme aan deur teks in kleiner subeenhede op te breek of die tokenisering proses te optimaliseer. 1. **Byte Pair Encoding (BPE):** -- **Purpose:** Verminder die grootte van die vocabulary en hanteer seldsame of onbekende woorde deur dit op te breek in gereeld voorkomende byte pare. -- **How It Works:** +- **Doel:** Verminder die grootte van die woordeskat en hanteer seldsame of onbekende woorde deur hulle op te breek in gereeld voorkomende byte pare. +- **Hoe Dit Werk:** - Begin met individuele karakters as tokens. -- Samevoeg die mees gereelde pare van tokens in 'n enkele token. +- Samevoeg iteratief die mees gereelde pare van tokens in 'n enkele token. - Gaan voort totdat daar geen meer gereelde pare is wat saamgevoeg kan word nie. -- **Benefits:** +- **Voordele:** - Elimineer die behoefte aan 'n `[UNK]` token aangesien alle woorde verteenwoordig kan word deur bestaande subwoord tokens te kombineer. -- Meer doeltreffende en buigsame vocabulary. -- _Example:_\ -`"playing"` mag as `["play", "ing"]` getokeniseer word as `"play"` en `"ing"` gereelde subwoorde is. +- Meer doeltreffende en buigsame woordeskat. +- _Voorbeeld:_\ +`"playing"` kan as `["play", "ing"]` getokeniseer word as `"play"` en `"ing"` gereelde subwoorde is. 2. **WordPiece:** -- **Used By:** Modelle soos BERT. -- **Purpose:** Soortgelyk aan BPE, breek dit woorde in subwoord eenhede op om onbekende woorde te hanteer en die vocabulary grootte te verminder. -- **How It Works:** -- Begin met 'n basis vocabulary van individuele karakters. +- **Gebruik Deur:** Modelle soos BERT. +- **Doel:** Soortgelyk aan BPE, breek dit woorde in subwoord eenhede op om onbekende woorde te hanteer en die grootte van die woordeskat te verminder. +- **Hoe Dit Werk:** +- Begin met 'n basiswoordeskat van individuele karakters. - Voeg iteratief die mees gereelde subwoord by wat die waarskynlikheid van die opleidingsdata maksimeer. - Gebruik 'n probabilistiese model om te besluit watter subwoorde saamgevoeg moet word. -- **Benefits:** -- Balans tussen 'n hanteerbare vocabulary grootte en effektiewe verteenwoordiging van woorde. +- **Voordele:** +- Balans tussen 'n hanteerbare woordeskatgrootte en effektiewe verteenwoordiging van woorde. - Hanteer seldsame en saamgestelde woorde doeltreffend. -- _Example:_\ -`"unhappiness"` mag as `["un", "happiness"]` of `["un", "happy", "ness"]` getokeniseer word, afhangende van die vocabulary. -3. **Unigram Language Model:** -- **Used By:** Modelle soos SentencePiece. -- **Purpose:** Gebruik 'n probabilistiese model om die mees waarskynlike stel van subwoord tokens te bepaal. -- **How It Works:** +- _Voorbeeld:_\ +`"unhappiness"` kan as `["un", "happiness"]` of `["un", "happy", "ness"]` getokeniseer word, afhangende van die woordeskat. +3. **Unigram Taalmodel:** +- **Gebruik Deur:** Modelle soos SentencePiece. +- **Doel:** Gebruik 'n probabilistiese model om die mees waarskynlike stel van subwoord tokens te bepaal. +- **Hoe Dit Werk:** - Begin met 'n groot stel potensiële tokens. -- Verwyder iteratief tokens wat die minste verbetering in die model se waarskynlikheid van die opleidingsdata bied. -- Finaliseer 'n vocabulary waar elke woord verteenwoordig word deur die mees waarskynlike subwoord eenhede. -- **Benefits:** +- Verwyder iteratief tokens wat die minste die model se waarskynlikheid van die opleidingsdata verbeter. +- Finaliseer 'n woordeskat waar elke woord verteenwoordig word deur die mees waarskynlike subwoord eenhede. +- **Voordele:** - Buigsame en kan taal meer natuurlik modelleer. -- Lei dikwels tot meer doeltreffende en kompakte tokeniseringen. -- _Example:_\ -`"internationalization"` mag in kleiner, betekenisvolle subwoorde soos `["international", "ization"]` getokeniseer word. +- Lei dikwels tot meer doeltreffende en kompakte tokenisering. +- _Voorbeeld:_\ +`"internationalization"` kan in kleiner, betekenisvolle subwoorde soos `["international", "ization"]` getokeniseer word. -## Code Example +## Code Voorbeeld -Let's understand this better from a code example from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): +Laat ons dit beter verstaan vanuit 'n kodevoorbeeld van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): ```python # Download a text to pre-train the model import urllib.request @@ -97,4 +97,4 @@ print(token_ids[:50]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index cfc460917..ecfba27f3 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,13 +1,13 @@ # 2. Data Sampling -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## **Data Sampling** -**Data Sampling** is 'n belangrike proses in die voorbereiding van data vir die opleiding van groot taalmodelle (LLMs) soos GPT. Dit behels die organisering van teksdata in invoer- en teikensekwensies wat die model gebruik om te leer hoe om die volgende woord (of token) te voorspel op grond van die voorafgaande woorde. Korrek data sampling verseker dat die model effektief taalpatrone en afhanklikhede vasvang. +**Data Sampling** is 'n belangrike proses om data voor te berei vir die opleiding van groot taalmodelle (LLMs) soos GPT. Dit behels die organisering van teksdata in invoer- en teikensekwensies wat die model gebruik om te leer hoe om die volgende woord (of token) te voorspel op grond van die voorafgaande woorde. Korrek data sampling verseker dat die model effektief taalpatrone en afhanklikhede vasvang. > [!TIP] -> Die doel van hierdie tweede fase is baie eenvoudig: **Monster die invoerdata en berei dit voor vir die opleidingsfase deur gewoonlik die dataset in sinne van 'n spesifieke lengte te skei en ook die verwagte reaksie te genereer.** +> Die doel van hierdie tweede fase is baie eenvoudig: **Steek die invoerdata en berei dit voor vir die opleidingsfase deur gewoonlik die dataset in sinne van 'n spesifieke lengte te skei en ook die verwagte reaksie te genereer.** ### **Why Data Sampling Matters** @@ -15,7 +15,7 @@ LLMs soos GPT word opgelei om teks te genereer of te voorspel deur die konteks w ### **Key Concepts in Data Sampling** -1. **Tokenization:** Die opsplitsing van teks in kleiner eenhede wat tokens genoem word (bv. woorde, subwoorde of karakters). +1. **Tokenization:** Om teks in kleiner eenhede genaamd tokens (bv. woorde, subwoorde of karakters) te verdeel. 2. **Sequence Length (max_length):** Die aantal tokens in elke invoersekwensie. 3. **Sliding Window:** 'n Metode om oorvleuelende invoersekwensies te skep deur 'n venster oor die getokeniseerde teks te beweeg. 4. **Stride:** Die aantal tokens wat die glijdende venster vorentoe beweeg om die volgende sekwensie te skep. @@ -86,7 +86,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", **Understanding Stride** - **Stride of 1:** Die venster beweeg vorentoe met een token elke keer, wat lei tot hoogs oorvleuelende reekse. Dit kan lei tot beter leer van kontekstuele verhoudings, maar kan die risiko van oorpassing verhoog aangesien soortgelyke datapunte herhaal word. -- **Stride of 2:** Die venster beweeg vorentoe met twee tokens elke keer, wat oorvleueling verminder. Dit verminder redundans en rekenaarlading, maar mag sommige kontekstuele nuanses mis. +- **Stride of 2:** Die venster beweeg vorentoe met twee tokens elke keer, wat oorvleueling verminder. Dit verminder redundans en rekenaarlading, maar mag dalk sommige kontekstuele nuanses mis. - **Stride Equal to max_length:** Die venster beweeg vorentoe met die hele venstergrootte, wat lei tot nie-oorvleuelende reekse. Dit minimaliseer data redundans, maar mag die model se vermoë om afhanklikhede oor reekse te leer beperk. **Example with Stride of 2:** @@ -235,4 +235,4 @@ tensor([[ 367, 2885, 1464, 1807], - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index 26ccb5842..65cf36112 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,6 +1,6 @@ # 3. Token Embeddings -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Token Embeddings @@ -12,23 +12,23 @@ Na die tokenisering van teksdata, is die volgende kritieke stap in die voorberei > > Boonop, tydens die token embedding **word 'n ander laag van embeddings geskep** wat (in hierdie geval) die **absolute posisie van die woord in die opleidingssin** verteenwoordig. Op hierdie manier sal 'n woord in verskillende posisies in die sin 'n ander voorstelling (betekenis) hê. -### **Wat is Token Embeddings?** +### **What Are Token Embeddings?** -**Token Embeddings** is numeriese verteenwoordigings van tokens in 'n deurlopende vektor ruimte. Elke token in die woordeskat is geassosieer met 'n unieke vektor van vaste dimensies. Hierdie vektore vang semantiese en sintaktiese inligting oor die tokens vas, wat die model in staat stel om verhoudings en patrone in die data te verstaan. +**Token Embeddings** is numeriese verteenwoordigings van tokens in 'n deurlopende vektorruimte. Elke token in die woordeskat is geassosieer met 'n unieke vektor van vaste dimensies. Hierdie vektore vang semantiese en sintaktiese inligting oor die tokens vas, wat die model in staat stel om verhoudings en patrone in die data te verstaan. -- **Woordeskatgrootte:** Die totale aantal unieke tokens (bv. woorde, subwoorde) in die model se woordeskat. -- **Embedding Dimensies:** Die aantal numeriese waardes (dimensies) in elke token se vektor. Hoër dimensies kan meer genuanseerde inligting vasvang, maar vereis meer rekenaarhulpbronne. +- **Vocabulary Size:** Die totale aantal unieke tokens (bv. woorde, subwoorde) in die model se woordeskat. +- **Embedding Dimensions:** Die aantal numeriese waardes (dimensies) in elke token se vektor. Hoër dimensies kan meer genuanseerde inligting vasvang, maar vereis meer rekenaarhulpbronne. -**Voorbeeld:** +**Example:** -- **Woordeskatgrootte:** 6 tokens \[1, 2, 3, 4, 5, 6] -- **Embedding Dimensies:** 3 (x, y, z) +- **Vocabulary Size:** 6 tokens \[1, 2, 3, 4, 5, 6] +- **Embedding Dimensions:** 3 (x, y, z) -### **Inisialisering van Token Embeddings** +### **Initializing Token Embeddings** Aan die begin van die opleiding, word token embeddings tipies geinisialiseer met klein random waardes. Hierdie aanvanklike waardes word aangepas (fyngestem) tydens die opleiding om die tokens se betekenisse beter te verteenwoordig op grond van die opleidingsdata. -**PyTorch Voorbeeld:** +**PyTorch Example:** ```python import torch @@ -84,8 +84,8 @@ Tydens opleiding word elke token in die invoerdata omgeskakel na sy ooreenstemme **Data Struktuur:** -- Elke batch word verteenwoordig as 'n 3D tensor met die vorm `(batch_size, max_length, embedding_dim)`. -- Vir ons voorbeeld sal die vorm wees `(8, 4, 256)`. +- Elke batch word verteenwoordig as 'n 3D tensor met vorm `(batch_size, max_length, embedding_dim)`. +- Vir ons voorbeeld, sal die vorm `(8, 4, 256)` wees. **Visualisering:** ```css @@ -130,7 +130,7 @@ Terwyl token embeddings die betekenis van individuele tokens vasvang, kodeer hul ### **Waarom Posisionele Embeddings Benodig Word:** - **Token Volgorde Maak Saak:** In sinne hang die betekenis dikwels af van die volgorde van woorde. Byvoorbeeld, "Die kat het op die mat gesit" teenoor "Die mat het op die kat gesit." -- **Embedding Beperking:** Sonder posisionele inligting behandel die model tokens as 'n "sak van woorde," terwyl hulle hul volgorde ignoreer. +- **Embedding Beperking:** Sonder posisionele inligting behandel die model tokens as 'n "sak van woorde," wat hulle volgorde ignoreer. ### **Tipes van Posisionele Embeddings:** @@ -205,4 +205,4 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 0e171e12e..996d5fe0a 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,10 +1,10 @@ # 4. Aandag Meganismes -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Aandag Meganismes en Self-Aandag in Neurale Netwerke -Aandag meganismes laat neurale netwerke toe om f**okus te plaas op spesifieke dele van die invoer wanneer hulle elke deel van die uitvoer genereer**. Hulle ken verskillende gewigte aan verskillende invoere toe, wat die model help om te besluit watter invoere die relevantste is vir die taak wat voorlê. Dit is van kardinale belang in take soos masjienvertaling, waar begrip van die konteks van die hele sin noodsaaklik is vir akkurate vertaling. +Aandag meganismes laat neurale netwerke toe om **op spesifieke dele van die invoer te fokus wanneer hulle elke deel van die uitvoer genereer**. Hulle ken verskillende gewigte aan verskillende invoere toe, wat die model help om te besluit watter invoere die relevantste is vir die taak wat voorlê. Dit is van kardinale belang in take soos masjienvertaling, waar begrip van die konteks van die hele sin noodsaaklik is vir akkurate vertaling. > [!TIP] > Die doel van hierdie vierde fase is baie eenvoudig: **Pas 'n paar aandag meganismes toe**. Hierdie gaan baie **herhaalde lae** wees wat die **verhouding van 'n woord in die woordeskat met sy bure in die huidige sin wat gebruik word om die LLM te train, gaan vasvang**.\ @@ -12,15 +12,15 @@ Aandag meganismes laat neurale netwerke toe om f**okus te plaas op spesifieke de ### Verstaan Aandag Meganismes -In tradisionele volgorde-tot-volgorde modelle wat vir taalvertaling gebruik word, kodeer die model 'n invoer volgorde in 'n vaste-grootte konteksvektor. Hierdie benadering sukkel egter met lang sinne omdat die vaste-grootte konteksvektor dalk nie al die nodige inligting vasvang nie. Aandag meganismes spreek hierdie beperking aan deur die model toe te laat om al die invoer tokens in ag te neem wanneer dit elke uitvoer token genereer. +In tradisionele volgorde-tot-volgorde modelle wat vir taalvertaling gebruik word, kodeer die model 'n invoer volgorde in 'n vaste-grootte konteksvektor. Hierdie benadering sukkel egter met lang sinne omdat die vaste-grootte konteksvektor dalk nie al die nodige inligting vasvang nie. Aandag meganismes spreek hierdie beperking aan deur die model toe te laat om al die invoer tokens te oorweeg wanneer dit elke uitvoer token genereer. #### Voorbeeld: Masjienvertaling -Oorweeg om die Duitse sin "Kannst du mir helfen diesen Satz zu übersetzen" in Engels te vertaal. 'n Woord-vir-woord vertaling sou nie 'n grammatikaal korrekte Engelse sin lewer nie weens verskille in grammatikaal strukture tussen tale. 'n Aandag meganisme stel die model in staat om op relevante dele van die invoer sin te fokus wanneer dit elke woord van die uitvoer sin genereer, wat lei tot 'n meer akkurate en samehangende vertaling. +Oorweeg om die Duitse sin "Kannst du mir helfen diesen Satz zu übersetzen" in Engels te vertaal. 'n Woord-vir-woord vertaling sou nie 'n grammatikaal korrekte Engelse sin lewer nie weens verskille in grammaticale strukture tussen tale. 'n Aandag meganisme stel die model in staat om op relevante dele van die invoer sin te fokus wanneer dit elke woord van die uitvoer sin genereer, wat lei tot 'n meer akkurate en samehangende vertaling. ### Inleiding tot Self-Aandag -Self-aandag, of intra-aandag, is 'n meganisme waar aandag binne 'n enkele volgorde toegepas word om 'n voorstelling van daardie volgorde te bereken. Dit laat elke token in die volgorde toe om op al die ander tokens te fokus, wat die model help om afhanklikhede tussen tokens vas te vang ongeag hul afstand in die volgorde. +Self-aandag, of intra-aandag, is 'n meganisme waar aandag binne 'n enkele volgorde toegepas word om 'n voorstelling van daardie volgorde te bereken. Dit laat elke token in die volgorde toe om op al die ander tokens te let, wat die model help om afhanklikhede tussen tokens vas te vang ongeag hul afstand in die volgorde. #### Sleutelkonsepte @@ -41,7 +41,7 @@ Ons doel is om die **konteksvektor** vir die woord **"shiny"** te bereken met be #### Stap 1: Bereken Aandag Punte > [!TIP] -> Vermy om in die wiskundige terme verlore te raak, die doel van hierdie funksie is eenvoudig, normaliseer al die gewigte sodat **hulle in totaal 1 optel**. +> Vermy om verlore te raak in die wiskundige terme, die doel van hierdie funksie is eenvoudig, normaliseer al die gewigte sodat **hulle in totaal 1 optel**. > > Boonop, **softmax** funksie word gebruik omdat dit verskille beklemtoon weens die eksponensiële deel, wat dit makliker maak om nuttige waardes te identifiseer. @@ -62,9 +62,11 @@ Vir elke woord in die sin, bereken die **aandag punt** ten opsigte van "shiny" d #### Stap 2: Normaliseer Aandag Punte om Aandag Gewigte te Verkry > [!TIP] -> Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte te omskep wat tot 1 optel. +> Moet nie verlore gaan in die wiskundige terme nie, die doel van hierdie funksie is eenvoudig, normaliseer al die gewigte sodat **hulle in totaal 1 optel**. +> +> Boonop, **softmax** funksie word gebruik omdat dit verskille beklemtoon weens die eksponensiële deel, wat dit makliker maak om nuttige waardes te identifiseer. -Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte om te skakel wat tot 1 optel. +Pas die **softmax funksie** toe op die aandag punte om hulle in aandag gewigte te omskep wat tot 1 optel.
@@ -83,7 +85,7 @@ Berekening van aandag gewigte: #### Stap 3: Bereken die Konteksvektor > [!TIP] -> Kry net elke aandag gewig en vermenigvuldig dit met die verwante token dimensies en som dan al die dimensies om net 1 vektor (die konteksvektor) te kry. +> Kry net elke aandag gewig en vermenigvuldig dit met die verwante token dimensies en som dan al die dimensies op om net 1 vektor (die konteksvektor) te kry. Die **konteksvektor** word bereken as die gewogen som van die embeddings van al die woorde, met behulp van die aandag gewigte. @@ -103,7 +105,7 @@ Berekening van elke komponent:
-Som die gewogen embeddings: +Som die gewogen embeddings op: `konteksvektor=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]` @@ -113,7 +115,7 @@ Som die gewogen embeddings: 1. **Bereken Aandag Punte**: Gebruik die dot produk tussen die embedding van die teikenwoord en die embeddings van al die woorde in die volgorde. 2. **Normaliseer Punte om Aandag Gewigte te Verkry**: Pas die softmax funksie toe op die aandag punte om gewigte te verkry wat tot 1 optel. -3. **Bereken Konteksvektor**: Vermenigvuldig elke woord se embedding met sy aandag gewig en som die resultate. +3. **Bereken Konteksvektor**: Vermenigvuldig elke woord se embedding met sy aandag gewig en som die resultate op. ## Self-Aandag met Leerbare Gewigte @@ -159,7 +161,7 @@ values = torch.matmul(inputs, W_value) **Bereken Aandag Punte** -Soos in die vorige voorbeeld, maar hierdie keer, in plaas daarvan om die waardes van die dimensies van die tokens te gebruik, gebruik ons die sleutel matriks van die token (wat reeds bereken is met behulp van die dimensies):. So, vir elke navraag `qi`​ en sleutel `kj​`: +Soos in die voorbeeld van tevore, maar hierdie keer, in plaas daarvan om die waardes van die dimensies van die tokens te gebruik, gebruik ons die sleutel matriks van die token (wat reeds bereken is met behulp van die dimensies):. So, vir elke navraag `qi`​ en sleutel `kj​`:
@@ -184,7 +186,7 @@ Soos in die aanvanklike voorbeeld, som net al die waardes matriks op deur elkeen ### Kode Voorbeeld -Gryp 'n voorbeeld van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) jy kan hierdie klas kyk wat die self-aandag funksionaliteit implementeer waaroor ons gepraat het: +Grijp 'n voorbeeld van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) jy kan hierdie klas kyk wat die self-aandag funksionaliteit implementeer waaroor ons gepraat het: ```python import torch @@ -228,15 +230,15 @@ print(sa_v2(inputs)) ## Oorsaaklike Aandag: Toekomstige Woorde Versteek -Vir LLMs wil ons hê dat die model slegs die tokens wat voor die huidige posisie verskyn, moet oorweeg om die **volgende token** te voorspel. **Oorsaaklike aandag**, ook bekend as **gemaskerde aandag**, bereik dit deur die aandagmeganisme te wysig om toegang tot toekomstige tokens te verhoed. +Vir LLM's wil ons hê dat die model slegs die tokens wat voor die huidige posisie verskyn, moet oorweeg om die **volgende token** te voorspel. **Oorsaaklike aandag**, ook bekend as **gemaskerde aandag**, bereik dit deur die aandagmeganisme te wysig om toegang tot toekomstige tokens te verhoed. ### Toepassing van 'n Oorsaaklike Aandagmasker -Om oorsaaklike aandag te implementeer, pas ons 'n masker toe op die aandag punte **voor die softmax-operasie** sodat die oorblywende eenhede steeds 1 sal optel. Hierdie masker stel die aandag punte van toekomstige tokens op negatiewe oneindigheid, wat verseker dat na die softmax, hul aandag gewigte nul is. +Om oorsaaklike aandag te implementeer, pas ons 'n masker toe op die aandagspunte **voor die softmax-operasie** sodat die oorblywende eenhede steeds 1 sal optel. Hierdie masker stel die aandagspunte van toekomstige tokens op negatiewe oneindigheid, wat verseker dat na die softmax, hul aandaggewigte nul is. **Stappe** -1. **Bereken Aandag Punten**: Dieselfde as voorheen. +1. **Bereken Aandagspunte**: Dieselfde as voorheen. 2. **Pas Masker Toe**: Gebruik 'n boonste driehoekige matriks wat met negatiewe oneindigheid bo die diagonaal gevul is. ```python @@ -244,15 +246,15 @@ mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1) * float('-inf') masked_scores = attention_scores + mask ``` -3. **Pas Softmax Toe**: Bereken aandag gewigte met behulp van die gemaskerde punte. +3. **Pas Softmax Toe**: Bereken aandaggewigte met behulp van die gemaskerde punte. ```python attention_weights = torch.softmax(masked_scores, dim=-1) ``` -### Maskering van Addisionele Aandag Gewigte met Dropout +### Maskering van Addisionele Aandaggewigte met Dropout -Om **oorpassing** te voorkom, kan ons **dropout** toepas op die aandag gewigte na die softmax-operasie. Dropout **maak sommige van die aandag gewigte ewekansig nul** tydens opleiding. +Om **oorpassing te voorkom**, kan ons **dropout** toepas op die aandaggewigte na die softmax-operasie. Dropout **maak sommige van die aandaggewigte ewekansig nul** tydens opleiding. ```python dropout = nn.Dropout(p=0.5) attention_weights = dropout(attention_weights) @@ -329,7 +331,7 @@ print("context_vecs.shape:", context_vecs.shape) ### Kode Voorbeeld -Dit kan moontlik wees om die vorige kode te hergebruik en net 'n omhulsel toe te voeg wat dit verskeie kere lanseer, maar dit is 'n meer geoptimaliseerde weergawe van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) wat al die koppe terselfdertyd verwerk (wat die aantal duur vir-lusse verminder). Soos jy in die kode kan sien, word die dimensies van elke token in verskillende dimensies verdeel volgens die aantal koppe. Op hierdie manier, as 'n token 8 dimensies het en ons 3 koppe wil gebruik, sal die dimensies in 2 arrays van 4 dimensies verdeel word en elke kop sal een daarvan gebruik: +Dit kan moontlik wees om die vorige kode te hergebruik en net 'n omhulsel toe te voeg wat dit verskeie kere ontplooi, maar dit is 'n meer geoptimaliseerde weergawe van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) wat al die koppe terselfdertyd verwerk (wat die aantal duur vir-lusse verminder). Soos jy in die kode kan sien, word die dimensies van elke token in verskillende dimensies verdeel volgens die aantal koppe. Op hierdie manier, as 'n token 8 dimensies het en ons 3 koppe wil gebruik, sal die dimensies in 2 arrays van 4 dimensies verdeel word en elke kop sal een daarvan gebruik: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): @@ -411,11 +413,11 @@ Vir 'n ander kompakte en doeltreffende implementering kan jy die [`torch.nn.Mult > [!TIP] > Kort antwoord van ChatGPT oor hoekom dit beter is om dimensies van tokens onder die koppe te verdeel in plaas daarvan om elke kop al die dimensies van al die tokens te laat nagaan: > -> Terwyl dit mag lyk asof dit voordelig is om elke kop al die inbedingsdimensies te laat verwerk omdat elke kop toegang tot die volle inligting sou hê, is die standaardpraktyk om die **inbedingsdimensies onder die koppe te verdeel**. Hierdie benadering balanseer rekenaardoeltreffendheid met modelprestasie en moedig elke kop aan om diverse voorstellings te leer. Daarom is dit oor die algemeen verkieslik om die inbedingsdimensies te verdeel eerder as om elke kop al die dimensies te laat nagaan. +> Terwyl dit mag lyk asof dit voordelig is om elke kop al die inbedingsdimensies te laat verwerk omdat elke kop toegang tot die volle inligting sou hê, is die standaard praktyk om die **inbedingsdimensies onder die koppe te verdeel**. Hierdie benadering balanseer rekenkundige doeltreffendheid met modelprestasie en moedig elke kop aan om diverse voorstellings te leer. Daarom is dit oor die algemeen verkieslik om die inbedingsdimensies te verdeel eerder as om elke kop al die dimensies te laat nagaan. ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 59f7f9fae..c7fcb3d97 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,6 +1,6 @@ # 5. LLM Argitektuur -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## LLM Argitektuur @@ -18,7 +18,7 @@ LLM argitektuur voorbeeld van [https://github.com/rasbt/LLMs-from-scratch/blob/m 1. **Invoer (Getokeniseerde Teks)**: Die proses begin met getokeniseerde teks, wat in numeriese voorstellings omgeskakel word. 2. **Token Inbed en Posisionele Inbed Laag**: Die getokeniseerde teks word deur 'n **token inbed** laag en 'n **posisionele inbed laag** gestuur, wat die posisie van tokens in 'n volgorde vasvang, krities vir die begrip van woordorde. 3. **Transformer Blokke**: Die model bevat **12 transformer blokke**, elk met verskeie lae. Hierdie blokke herhaal die volgende volgorde: -- **Gemaskerde Multi-Kop Aandag**: Laat die model toe om op verskillende dele van die invoerteks gelyktydig te fokus. +- **Gemaskerde Multi-Kop Aandag**: Laat die model toe om op verskillende dele van die invoer teks gelyktydig te fokus. - **Laag Normalisering**: 'n Normalisering stap om opleiding te stabiliseer en te verbeter. - **Voed Voor Laag**: Verantwoordelik vir die verwerking van die inligting van die aandag laag en om voorspellings oor die volgende token te maak. - **Dropout Lae**: Hierdie lae voorkom oorpassing deur eenhede tydens opleiding lukraak te laat val. @@ -213,13 +213,13 @@ torch.sqrt(torch.tensor(2.0 / torch.pi)) * #### **Doel en Funksionaliteit** - **GELU (Gaussian Error Linear Unit):** 'n Aktiveringsfunksie wat nie-lineariteit in die model inbring. -- **Glad Aktivering:** Anders as ReLU, wat negatiewe insette op nul stel, kaart GELU insette glad aan uitsette, wat klein, nie-nul waardes vir negatiewe insette toelaat. +- **Glad Aktivering:** Anders as ReLU, wat negatiewe insette op nul stel, kaart GELU insette glad na uitsette, wat vir klein, nie-nul waardes vir negatiewe insette toelaat. - **Wiskundige Definisie:**
> [!TIP] -> Die doel van die gebruik van hierdie funksie na lineêre lae binne die FeedForward-lae is om die lineêre data te verander na nie-lineêr om die model in staat te stel om komplekse, nie-lineêre verhoudings te leer. +> Die doel van die gebruik van hierdie funksie na lineêre lae binne die FeedForward-laag is om die lineêre data te verander na nie-lineêr om die model in staat te stel om komplekse, nie-lineêre verhoudings te leer. ### **FeedForward Neurale Netwerk** @@ -252,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **Tweede Lineêre Laag:** Verminder die dimensie terug na `emb_dim`. > [!TIP] -> Soos jy kan sien, gebruik die Feed Forward netwerk 3 lae. Die eerste een is 'n lineêre laag wat die dimensies met 4 sal vermenigvuldig met behulp van lineêre gewigte (parameters om binne die model te train). Dan word die GELU-funksie in al daardie dimensies gebruik om nie-lineêre variasies toe te pas om ryker verteenwoordigings te vang, en uiteindelik word 'n ander lineêre laag gebruik om terug te keer na die oorspronklike grootte van dimensies. +> Soos jy kan sien, gebruik die Feed Forward netwerk 3 lae. Die eerste een is 'n lineêre laag wat die dimensies met 4 sal vermenigvuldig deur lineêre gewigte (parameters om binne die model te train). Dan word die GELU-funksie in al daardie dimensies gebruik om nie-lineêre variasies toe te pas om ryker verteenwoordigings te vang en uiteindelik word 'n ander lineêre laag gebruik om terug te keer na die oorspronklike grootte van dimensies. ### **Multi-Head Aandag Meganisme** @@ -260,7 +260,7 @@ Dit is reeds in 'n vroeëre afdeling verduidelik. #### **Doel en Funksionaliteit** -- **Multi-Head Self-Attention:** Laat die model toe om op verskillende posisies binne die invoer volgorde te fokus wanneer 'n token gekodeer word. +- **Multi-Head Self-Attention:** Laat die model toe om op verskillende posisies binne die invoerreeks te fokus wanneer 'n token gekodeer word. - **Sleutel Komponente:** - **Vrae, Sleutels, Waardes:** Lineêre projeksies van die invoer, gebruik om aandag punte te bereken. - **Koppe:** Meervoudige aandag meganismes wat parallel loop (`num_heads`), elk met 'n verminderde dimensie (`head_dim`). @@ -273,7 +273,7 @@ Dit is reeds in 'n vroeëre afdeling verduidelik. > [!TIP] > Die doel van hierdie netwerk is om die verhoudings tussen tokens in dieselfde konteks te vind. Boonop word die tokens in verskillende koppe verdeel om oorfitting te voorkom, alhoewel die finale verhoudings wat per kop gevind word aan die einde van hierdie netwerk gekombineer word. > -> Boonop, tydens opleiding, word 'n **oorsaaklike masker** toegepas sodat latere tokens nie in ag geneem word wanneer die spesifieke verhoudings met 'n token gekyk word nie, en 'n **dropout** word ook toegepas om **oorfitting te voorkom**. +> Boonop, tydens opleiding, word 'n **oorsaaklike masker** toegepas sodat latere tokens nie in ag geneem word wanneer die spesifieke verhoudings met 'n token gekyk word nie en 'n **dropout** word ook toegepas om **oorfitting te voorkom**. ### **Laag** Normalisering ```python @@ -300,7 +300,7 @@ return self.scale * norm_x + self.shift - **Normalisering Proses:** - **Bereken Gemiddelde (`mean`):** Bereken die gemiddelde van die inset `x` oor die embedding dimensie (`dim=-1`), terwyl die dimensie vir uitsending behou word (`keepdim=True`). - **Bereken Variansie (`var`):** Bereken die variansie van `x` oor die embedding dimensie, terwyl die dimensie ook behou word. Die `unbiased=False` parameter verseker dat die variansie bereken word met die bevooroordeelde skatter (deling deur `N` in plaas van `N-1`), wat toepaslik is wanneer daar oor kenmerke eerder as monsters genormaliseer word. -- **Normaliseer (`norm_x`):** Trek die gemiddelde van `x` af en deel deur die vierkantswortel van die variansie plus `eps`. +- **Normaliseer (`norm_x`):** Trek die gemiddelde van `x` af en deel deur die vierkantwortel van die variansie plus `eps`. - **Skaal en Verskuif:** Pas die leerbare `scale` en `shift` parameters toe op die genormaliseerde uitset. > [!TIP] @@ -352,30 +352,30 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **Samestelling van Lae:** Kombineer multi-head aandag, feedforward netwerk, laanormalisering, en residuele verbindings. - **Laanormalisering:** Toegepas voor die aandag en feedforward lae vir stabiele opleiding. -- **Residuele Verbindings (Kortpaaie):** Voeg die inset van 'n laag by sy uitvoer om die gradiëntvloei te verbeter en die opleiding van diep netwerke moontlik te maak. +- **Residuele Verbindings (Kortpaaie):** Voeg die invoer van 'n laag by sy uitvoer om die gradiëntvloei te verbeter en die opleiding van diep netwerke moontlik te maak. - **Dropout:** Toegepas na aandag en feedforward lae vir regulering. #### **Stap-vir-Stap Funksionaliteit** 1. **Eerste Residuele Pad (Self-Aandag):** -- **Inset (`shortcut`):** Stoor die oorspronklike inset vir die residuele verbinding. -- **Laag Norm (`norm1`):** Normaliseer die inset. +- **Invoer (`shortcut`):** Stoor die oorspronklike invoer vir die residuele verbinding. +- **Laag Norm (`norm1`):** Normaliseer die invoer. - **Multi-Head Aandag (`att`):** Pas self-aandag toe. - **Dropout (`drop_shortcut`):** Pas dropout toe vir regulering. -- **Voeg Residueel By (`x + shortcut`):** Kombineer met die oorspronklike inset. +- **Voeg Residueel By (`x + shortcut`):** Kombineer met die oorspronklike invoer. 2. **Tweedee Residuele Pad (FeedForward):** -- **Inset (`shortcut`):** Stoor die opgedateerde inset vir die volgende residuele verbinding. -- **Laag Norm (`norm2`):** Normaliseer die inset. +- **Invoer (`shortcut`):** Stoor die opgedateerde invoer vir die volgende residuele verbinding. +- **Laag Norm (`norm2`):** Normaliseer die invoer. - **FeedForward Netwerk (`ff`):** Pas die feedforward transformasie toe. - **Dropout (`drop_shortcut`):** Pas dropout toe. -- **Voeg Residueel By (`x + shortcut`):** Kombineer met die inset van die eerste residuele pad. +- **Voeg Residueel By (`x + shortcut`):** Kombineer met die invoer van die eerste residuele pad. > [!TIP] > Die transformer blok groepeer al die netwerke saam en pas 'n paar **normalisering** en **dropouts** toe om die opleidingsstabiliteit en resultate te verbeter.\ > Let op hoe dropouts gedoen word na die gebruik van elke netwerk terwyl normalisering voor toegepas word. > -> Boonop gebruik dit ook kortpaaie wat bestaan uit **die uitvoer van 'n netwerk by sy inset te voeg**. Dit help om die verdwynende gradiënt probleem te voorkom deur te verseker dat aanvanklike lae "net soveel" bydra as die laaste. - +> Boonop gebruik dit ook kortpaaie wat bestaan uit **die uitvoer van 'n netwerk by sy invoer te voeg**. Dit help om die verdwynende gradiëntprobleem te voorkom deur te verseker dat aanvanklike lae "net soveel" bydra as die laaste. + ### **GPTModel** _Vorms is as kommentaar bygevoeg om die vorms van matrikse beter te verstaan:_ @@ -436,12 +436,12 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) #### **Doel en Funksionaliteit** - **Inbedingslae:** -- **Token Inbedings (`tok_emb`):** Converteer token-indekse na inbedings. Ter herinnering, dit is die gewigte wat aan elke dimensie van elke token in die woordeskat gegee word. +- **Token Inbedings (`tok_emb`):** Converteer token-indekse in inbedings. Ter herinnering, dit is die gewigte wat aan elke dimensie van elke token in die woordeskat gegee word. - **Posisionele Inbedings (`pos_emb`):** Voeg posisionele inligting by die inbedings om die volgorde van tokens vas te vang. Ter herinnering, dit is die gewigte wat aan tokens gegee word volgens hul posisie in die teks. - **Dropout (`drop_emb`):** Toegepas op inbedings vir regularisering. - **Transformer Blokke (`trf_blocks`):** Stapel van `n_layers` transformer blokke om inbedings te verwerk. - **Finale Normalisering (`final_norm`):** Laag normalisering voor die uitvoerlaag. -- **Uitvoer Laag (`out_head`):** Projek die finale verborge toestande na die woordeskatgrootte om logits vir voorspelling te produseer. +- **Uitvoerlaag (`out_head`):** Projek die finale verborge toestande na die woordeskatgrootte om logits vir voorspelling te produseer. > [!TIP] > Die doel van hierdie klas is om al die ander genoemde netwerke te gebruik om **die volgende token in 'n volgorde te voorspel**, wat fundamenteel is vir take soos teksgenerasie. @@ -503,7 +503,7 @@ Daar is 12 transformer blokke, so ons sal die parameters vir een blok bereken en - **Uitset Projektering (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` - **Berekeninge:** -- **Elk van `W_query`, `W_key`, `W_value`:** +- **Elkeen van `W_query`, `W_key`, `W_value`:** ```python qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 @@ -564,7 +564,7 @@ ff_params = 2,362,368 + 2,360,064 = 4,722,432 - **Berekeninge:** ```python -pythonCopy codelayer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 +layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 ``` **d. Totale Parameters per Transformer Blok** @@ -612,7 +612,7 @@ total_params = 163,009,536 Om 'n model te hê wat die volgende token voorspel soos die vorige, is dit net nodig om die laaste tokenwaardes van die uitvoer te neem (aangesien dit die waardes van die voorspelde token sal wees), wat 'n **waarde per inskrywing in die woordeskat** sal wees en dan die `softmax` funksie te gebruik om die dimensies in waarskynlikhede te normaliseer wat 1 optel en dan die indeks van die grootste inskrywing te kry, wat die indeks van die woord binne die woordeskat sal wees. -Code from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb): +Code van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb): ```python def generate_text_simple(model, idx, max_new_tokens, context_size): # idx is (batch, n_tokens) array of indices in the current context @@ -668,4 +668,4 @@ print("Output length:", len(out[0])) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index 22804d6da..c943e5df4 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,10 +1,10 @@ # 6. Vooropleiding & Laai modelle -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Teksgenerasie -Om 'n model op te lei, moet ons hê dat daardie model nuwe tokens kan genereer. Dan sal ons die gegenereerde tokens vergelyk met die verwagte om die model te leer om **die tokens wat dit moet genereer** te leer. +Om 'n model op te lei, moet ons hê dat daardie model in staat is om nuwe tokens te genereer. Dan sal ons die gegenereerde tokens vergelyk met die verwagte om die model te leer om **die tokens wat dit moet genereer** te leer. Soos in die vorige voorbeelde het ons reeds 'n paar tokens voorspel, dit is moontlik om daardie funksie vir hierdie doel te hergebruik. @@ -18,9 +18,9 @@ Om 'n korrekte opleiding uit te voer, is dit nodig om die voorspellings wat vir Om die waarskynlikheid van die korrekte token te maksimeer, moet die gewigte van die model aangepas word sodat daardie waarskynlikheid gemaksimeer word. Die opdaterings van die gewigte word gedoen deur middel van **terugpropagasie**. Dit vereis 'n **verliesfunksie om te maksimeer**. In hierdie geval sal die funksie die **verskil tussen die uitgevoerde voorspelling en die gewenste een** wees. Echter, in plaas daarvan om met die rou voorspellings te werk, sal dit met 'n logaritme met basis n werk. So as die huidige voorspelling van die verwagte token 7.4541e-05 was, is die natuurlike logaritme (basis *e*) van **7.4541e-05** ongeveer **-9.5042**.\ -Dan, vir elke invoer met 'n kontekslengte van 5 tokens, sal die model 5 tokens moet voorspel, met die eerste 4 tokens die laaste een van die invoer en die vyfde die voorspelde een. Daarom sal ons vir elke invoer 5 voorspellings hê in daardie geval (selfs al was die eerste 4 in die invoer, weet die model nie hiervan nie) met 5 verwagte tokens en dus 5 waarskynlikhede om te maksimeer. +Dan, vir elke invoer met 'n kontekslengte van 5 tokens, sal die model 5 tokens moet voorspel, met die eerste 4 tokens die laaste een van die invoer en die vyfde die voorspelde een. Daarom sal ons vir elke invoer 5 voorspellings in daardie geval hê (selfs al was die eerste 4 in die invoer, weet die model nie hiervan nie) met 5 verwagte tokens en dus 5 waarskynlikhede om te maksimeer. -Daarom, nadat die natuurlike logaritme op elke voorspelling uitgevoer is, word die **gemiddelde** bereken, die **minus simbool verwyder** (dit word _kruisentropieverlies_ genoem) en dit is die **nommer om so naby aan 0 as moontlik te verminder** omdat die natuurlike logaritme van 1 0 is: +Daarom, nadat die natuurlike logaritme op elke voorspelling uitgevoer is, word die **gemiddelde** bereken, die **minus simbool verwyder** (dit word _cross entropy loss_ genoem) en dit is die **nommer om so naby aan 0 as moontlik te verminder** omdat die natuurlike logaritme van 1 0 is:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

@@ -29,7 +29,7 @@ Byvoorbeeld, 'n perplexity waarde van 48725 beteken dat wanneer dit nodig is om ## Voorbeeld van Vooropleiding -Dit is die aanvanklike kode wat voorgestel word in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) soms effens gewysig +Dit is die aanvanklike kode wat voorgestel is in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) soms effens aangepas
@@ -529,7 +529,7 @@ torch.save({ ``` ### Funksies om teks <--> ids te transformeer -Hierdie is 'n paar eenvoudige funksies wat gebruik kan word om van teks uit die woordeskat na ids en omgekeerd te transformeer. Dit is nodig aan die begin van die hantering van die teks en aan die einde van die voorspellings: +Dit is 'n paar eenvoudige funksies wat gebruik kan word om van teks uit die woordeskat na ids en omgekeerd te transformeer. Dit is nodig aan die begin van die hantering van die teks en aan die einde van die voorspellings: ```python # Functions to transform from tokens to ids and from to ids to tokens def text_to_token_ids(text, tokenizer): @@ -543,13 +543,13 @@ return tokenizer.decode(flat.tolist()) ``` ### Genereer teks funksies -In 'n vorige afdeling is 'n funksie wat net die **meest waarskynlike token** gekry het na die logits. Dit sal egter beteken dat vir elke invoer dieselfde uitvoer altyd gegenereer sal word, wat dit baie deterministies maak. +In 'n vorige afdeling was daar 'n funksie wat net die **meest waarskynlike token** gekry het na die logits. Dit sal egter beteken dat vir elke invoer dieselfde uitvoer altyd gegenereer sal word, wat dit baie deterministies maak. Die volgende `generate_text` funksie sal die `top-k`, `temperature` en `multinomial` konsepte toepas. -- Die **`top-k`** beteken dat ons sal begin om alle waarskynlikhede van al die tokens na `-inf` te verminder, behalwe vir die top k tokens. So, as k=3, voordat 'n besluit geneem word, sal slegs die 3 meest waarskynlike tokens 'n waarskynlikheid hê wat verskil van `-inf`. -- Die **`temperature`** beteken dat elke waarskynlikheid deur die temperatuurwaarde gedeel sal word. 'n Waarde van `0.1` sal die hoogste waarskynlikheid verbeter in vergelyking met die laagste, terwyl 'n temperatuur van `5` byvoorbeeld dit meer plat sal maak. Dit help om die variasie in antwoorde te verbeter wat ons wil hê die LLM moet hê. -- Na die temperatuur toegepas is, word 'n **`softmax`** funksie weer toegepas om te maak dat al die oorblywende tokens 'n totale waarskynlikheid van 1 het. +- Die **`top-k`** beteken dat ons sal begin om alle waarskynlikhede van al die tokens na `-inf` te verminder, behalwe vir die top k tokens. So, as k=3, sal slegs die 3 meest waarskynlike tokens 'n waarskynlikheid hê wat verskil van `-inf` voordat 'n besluit geneem word. +- Die **`temperature`** beteken dat elke waarskynlikheid deur die temperatuurwaarde gedeel sal word. 'n Waarde van `0.1` sal die hoogste waarskynlikheid verbeter in vergelyking met die laagste een, terwyl 'n temperatuur van `5` byvoorbeeld dit meer plat sal maak. Dit help om die variasie in antwoorde wat ons wil hê die LLM moet hê, te verbeter. +- Na die temperatuur toegepas is, word 'n **`softmax`** funksie weer toegepas om al die oorblywende tokens 'n totale waarskynlikheid van 1 te gee. - Laastens, in plaas daarvan om die token met die grootste waarskynlikheid te kies, word die funksie **`multinomial`** toegepas om **die volgende token te voorspel volgens die finale waarskynlikhede**. So as token 1 'n 70% waarskynlikheid gehad het, token 2 'n 20% en token 3 'n 10%, sal token 1 70% van die tyd gekies word, token 2 20% van die tyd en token 3 10% van die tyd. ```python # Generate text function @@ -592,7 +592,7 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> Daar is 'n algemene alternatief vir `top-k` genoem [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), ook bekend as nucleus sampling, wat in plaas daarvan om k monsters met die meeste waarskynlikheid te verkry, **organiseer** dit al die resulterende **vokabulaire** volgens waarskynlikhede en **som** dit op van die hoogste waarskynlikheid tot die laagste totdat 'n **drempel bereik word**. +> Daar is 'n algemene alternatief vir `top-k` genoem [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), ook bekend as nucleus sampling, wat in plaas daarvan om k monsters met die meeste waarskynlikheid te verkry, **organiseer** dit al die resulterende **vokabulaire** volgens waarskynlikhede en **som** dit op van die hoogste waarskynlikheid na die laagste totdat 'n **drempel bereik word**. > > Dan sal **slegs daardie woorde** van die vokabulaire oorweeg word volgens hul relatiewe waarskynlikhede. > @@ -601,15 +601,15 @@ return idx > _Let daarop dat hierdie verbetering nie in die vorige kode ingesluit is nie._ > [!TIP] -> 'n Ander manier om die gegenereerde teks te verbeter, is deur **Beam search** te gebruik in plaas van die greedy search wat in hierdie voorbeeld gebruik word.\ -> Anders as greedy search, wat die mees waarskynlike volgende woord by elke stap kies en 'n enkele reeks bou, **hou beam search die top 𝑘 k hoogste-telling gedeeltelike reekse** (genoem "beams") by elke stap dop. Deur verskeie moontlikhede gelyktydig te verken, balanseer dit doeltreffendheid en kwaliteit, wat die kanse verhoog om 'n **beter algehele** reeks te vind wat dalk deur die greedy benadering gemis kan word weens vroeë, suboptimale keuses. +> 'n Ander manier om die gegenereerde teks te verbeter, is deur **Beam search** te gebruik in plaas van die greedy search wat in hierdie voorbeeld gebruik is.\ +> Anders as greedy search, wat die mees waarskynlike volgende woord by elke stap kies en 'n enkele volgorde bou, **hou beam search die top 𝑘 k hoogste-telling gedeeltelike volgordes** (genoem "beams") by elke stap dop. Deur verskeie moontlikhede gelyktydig te verken, balanseer dit doeltreffendheid en kwaliteit, wat die kanse verhoog om 'n **beter algehele** volgorde te vind wat dalk deur die greedy benadering gemis kan word weens vroeë, suboptimale keuses. > > _Let daarop dat hierdie verbetering nie in die vorige kode ingesluit is nie._ -### Verlies funksies +### Verliesfunksies -Die **`calc_loss_batch`** funksie bereken die kruis entropie van 'n voorspelling van 'n enkele batch.\ -Die **`calc_loss_loader`** verkry die kruis entropie van al die batches en bereken die **gemiddelde kruis entropie**. +Die **`calc_loss_batch`** funksie bereken die kruisentropie van 'n voorspelling van 'n enkele bondel.\ +Die **`calc_loss_loader`** verkry die kruisentropie van al die bondels en bereken die **gemiddelde kruisentropie**. ```python # Define loss functions def calc_loss_batch(input_batch, target_batch, model, device): @@ -637,7 +637,7 @@ break return total_loss / num_batches ``` > [!TIP] -> **Gradient clipping** is 'n tegniek wat gebruik word om **opleiding stabiliteit** in groot neurale netwerke te verbeter deur 'n **maksimum drempel** vir gradiëntgroottes in te stel. Wanneer gradiënte hierdie voorafbepaalde `max_norm` oorskry, word hulle proporsioneel afgeneem om te verseker dat opdaterings aan die model se parameters binne 'n hanteerbare reeks bly, wat probleme soos ontploffende gradiënte voorkom en 'n meer beheerde en stabiele opleiding verseker. +> **Gradient clipping** is 'n tegniek wat gebruik word om **opleiding stabiliteit** in groot neurale netwerke te verbeter deur 'n **maksimum drempel** vir gradientgroottes in te stel. Wanneer gradienten hierdie voorafbepaalde `max_norm` oorskry, word hulle proporsioneel afgeneem om te verseker dat opdaterings aan die model se parameters binne 'n hanteerbare reeks bly, wat probleme soos ontploffende gradienten voorkom en 'n meer beheerde en stabiele opleiding verseker. > > _Let daarop dat hierdie verbetering nie in die vorige kode ingesluit is._ > @@ -649,13 +649,13 @@ return total_loss / num_batches Die funksies `create_dataloader_v1` en `create_dataloader_v1` is reeds in 'n vorige afdeling bespreek. -Van hier af, let op hoe dit gedefinieer is dat 90% van die teks vir opleiding gebruik gaan word terwyl die 10% vir validasie gebruik sal word en albei stelle in 2 verskillende data laders gestoor word.\ +Van hier af, let op hoe dit gedefinieer is dat 90% van die teks vir opleiding gebruik gaan word terwyl die 10% vir validasie gebruik sal word en albei stelle in 2 verskillende data laaiers gestoor word.\ Let daarop dat 'n deel van die datastel soms ook vir 'n toetsstel gelaat word om die prestasie van die model beter te evalueer. -Albei data laders gebruik dieselfde batchgrootte, maksimum lengte en stapgrootte en aantal werkers (0 in hierdie geval).\ -Die hoofverskille is die data wat deur elkeen gebruik word, en die validators laat nie die laaste val nie en skud ook nie die data nie, aangesien dit nie vir validasiedoeleindes nodig is nie. +Albei data laaiers gebruik dieselfde batchgrootte, maksimum lengte en stapgrootte en aantal werkers (0 in hierdie geval).\ +Die hoof verskille is die data wat deur elkeen gebruik word, en die validators laat nie die laaste val nie en skud ook nie die data nie, aangesien dit nie vir validasiedoeleindes nodig is nie. -Ook die feit dat **stapgrootte so groot soos die kontekslengte is**, beteken dat daar geen oorvleueling tussen kontekste wat gebruik word om die data op te lei sal wees nie (vermin oorpassing maar ook die opleidingsdatastel). +Ook die feit dat **stapgrootte so groot soos die kontekste lengte is**, beteken dat daar nie oorvleueling tussen kontekste wat gebruik word om die data op te lei sal wees nie (vermin die oorpassing maar ook die opleidingsdatastel). Boonop, let daarop dat die batchgrootte in hierdie geval 2 is om die data in 2 batches te verdeel, die hoofdoel hiervan is om parallelle verwerking toe te laat en die verbruik per batch te verminder. ```python @@ -723,7 +723,7 @@ print("All tokens:", train_tokens + val_tokens) ``` ### Kies toestel vir opleiding & vooraf berekeninge -Die volgende kode kies net die toestel om te gebruik en bereken 'n opleidingsverlies en 'n validasieverlies (sonder om enigiets nog op te lei) as 'n beginpunt. +Die volgende kode kies net die toestel om te gebruik en bereken 'n opleidingsverlies en 'n valideringsverlies (sonder om enigiets nog op te lei) as 'n beginpunt. ```python # Indicate the device to use @@ -760,13 +760,13 @@ Dan is die groot funksie `train_model_simple` die een wat eintlik die model ople - Die validator laaier - Die **optimizer** wat tydens opleiding gebruik moet word: Dit is die funksie wat die gradiënte sal gebruik en die parameters sal opdateer om die verlies te verminder. In hierdie geval, soos jy sal sien, word `AdamW` gebruik, maar daar is baie meer. - `optimizer.zero_grad()` word aangeroep om die gradiënte op elke ronde te reset om te voorkom dat hulle ophoop. -- Die **`lr`** parameter is die **leer tempo** wat die **grootte van die stappe** bepaal wat tydens die optimaliseringsproses geneem word wanneer die model se parameters opdateer word. 'n **Kleinere** leer tempo beteken die optimizer **maak kleiner opdaterings** aan die gewigte, wat kan lei tot meer **presiese** konvergensie maar kan **opleiding vertraag**. 'n **Groter** leer tempo kan opleiding versnel maar **risiko's om oor te skiet** van die minimum van die verliesfunksie (**spring oor** die punt waar die verliesfunksie geminimaliseer word). +- Die **`lr`** parameter is die **leer tempo** wat die **grootte van die stappe** bepaal wat tydens die optimaliseringsproses geneem word wanneer die model se parameters opgedateer word. 'n **Kleinere** leer tempo beteken die optimizer **maak kleiner opdaterings** aan die gewigte, wat kan lei tot meer **presiese** konvergensie maar kan **opleiding vertraag**. 'n **Groter** leer tempo kan opleiding versnel maar **risiko's om oor te skiet** van die minimum van die verliesfunksie (**spring oor** die punt waar die verliesfunksie geminimaliseer word). - **Gewig Afsak** wysig die **Verlies Berekening** stap deur 'n ekstra term by te voeg wat groot gewigte straf. Dit moedig die optimizer aan om oplossings met kleiner gewigte te vind, wat 'n balans skep tussen die data goed aan te pas en die model eenvoudig te hou om oorpassing in masjienleer modelle te voorkom deur die model te ontmoedig om te veel belang aan enige enkele kenmerk toe te ken. -- Tradisionele optimizers soos SGD met L2 regulering koppel gewig afsak met die gradiënt van die verliesfunksie. egter, **AdamW** (n variant van Adam optimizer) ontkoppel gewig afsak van die gradiënt opdatering, wat lei tot meer effektiewe regulering. +- Tradisionele optimizers soos SGD met L2 regulering koppel gewig afsak met die gradiënt van die verliesfunksie. egter, **AdamW** (n variant van Adam optimizer) ontkoppel gewig afsak van die gradiëntopdatering, wat lei tot meer effektiewe regulering. - Die toestel om vir opleiding te gebruik - Die aantal epoches: Aantal kere om oor die opleidingsdata te gaan -- Die evaluering frekwensie: Die frekwensie om `evaluate_model` aan te roep -- Die evaluering iterasie: Die aantal bondels om te gebruik wanneer die huidige toestand van die model geëvalueer word wanneer `generate_and_print_sample` aangeroep word +- Die evaluasiefrekwensie: Die frekwensie om `evaluate_model` aan te roep +- Die evaluasie-iterasie: Die aantal bondels om te gebruik wanneer die huidige toestand van die model geëvalueer word wanneer `generate_and_print_sample` aangeroep word - Die begin konteks: Wat die begin sin is om te gebruik wanneer `generate_and_print_sample` aangeroep word - Die tokenizer ```python @@ -833,7 +833,7 @@ model.train() # Back to training model applying all the configurations > Om die leer tempo te verbeter, is daar 'n paar relevante tegnieke genaamd **lineêre opwarming** en **kosyn afname.** > > **Lineêre opwarming** bestaan uit die definieer van 'n aanvanklike leer tempo en 'n maksimum een en om dit konsekwent na elke epocha op te dateer. Dit is omdat die begin van die opleiding met kleiner gewig opdaterings die risiko verminder dat die model groot, destabiliserende opdaterings tydens sy opleidingsfase teëkom.\ -> **Kosyn afname** is 'n tegniek wat **geleidelik die leer tempo verminder** volgens 'n half-kosynkurwe **na die opwarm** fase, wat gewig opdaterings vertraag om **die risiko van oorskiet** van die verlies minima te minimaliseer en om opleidingsstabiliteit in latere fases te verseker. +> **Kosyn afname** is 'n tegniek wat **geleidelik die leer tempo verminder** volgens 'n half-kosyn kromme **na die opwarm** fase, wat gewig opdaterings vertraag om **die risiko van oorskry** van die verlies minima te minimaliseer en om opleidings stabiliteit in latere fases te verseker. > > _Let daarop dat hierdie verbeterings nie in die vorige kode ingesluit is nie._ @@ -936,11 +936,11 @@ model.eval() # Put in eval mode Daar is 2 vinnige skripte om die GPT2 gewigte plaaslik te laai. Vir albei kan jy die repository [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) plaaslik kloon, dan: - Die skrip [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) sal al die gewigte aflaai en die formate van OpenAI na die formate wat deur ons LLM verwag word, transformeer. Die skrip is ook voorberei met die nodige konfigurasie en met die prompt: "Elke poging beweeg jou" -- Die skrip [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) laat jou toe om enige van die GPT2 gewigte plaaslik te laai (verander net die `CHOOSE_MODEL` var) en teks te voorspel vanaf 'n paar prompts. +- Die skrip [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) laat jou toe om enige van die GPT2 gewigte plaaslik te laai (verander net die `CHOOSE_MODEL` var) en teks te voorspel vanaf sommige prompts. ## Verwysings - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index fae1361a8..b4323518d 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,6 +1,6 @@ # 7.0. LoRA Verbeterings in fyn-afstemming -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## LoRA Verbeterings @@ -19,7 +19,7 @@ LoRA maak dit moontlik om **groot modelle** doeltreffend fyn af te stem deur sle 3. **Doeltreffende Taakspesifieke Fyn-afstemming**: Wanneer jy die model wil aanpas vir 'n **nuwe taak**, kan jy net die **klein LoRA matrikse** (A en B) oplei terwyl jy die res van die model soos dit is, laat. Dit is **baie doeltreffender** as om die hele model weer op te lei. 4. **Bergingseffektiwiteit**: Na fyn-afstemming, in plaas daarvan om 'n **heel nuwe model** vir elke taak te stoor, hoef jy slegs die **LoRA matrikse** te stoor, wat baie klein is in vergelyking met die hele model. Dit maak dit makliker om die model aan te pas vir baie take sonder om te veel berging te gebruik. -Om LoraLayers in plaas van Linear te implementeer tydens 'n fyn-afstemming, word hierdie kode hier voorgestel [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): +Om LoraLayers in plaas van Linear eenhede tydens 'n fyn-afstemming te implementeer, word hierdie kode hier voorgestel [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): ```python import math @@ -62,4 +62,4 @@ replace_linear_with_lora(module, rank, alpha) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index 5c38f1982..bd4afca24 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,32 +1,32 @@ # 7.1. Fyn-afstemming vir Kategorisering -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Wat is Fyn-afstemming is die proses om 'n **vooraf-geleerde model** te neem wat **algemene taalpatrone** uit groot hoeveelhede data geleer het en dit **aan te pas** om 'n **spesifieke taak** uit te voer of om domein-spesifieke taal te verstaan. Dit word bereik deur die opleiding van die model voort te sit op 'n kleiner, taak-spesifieke dataset, wat dit toelaat om sy parameters aan te pas om beter by die nuanses van die nuwe data te pas terwyl dit die breë kennis wat dit reeds verwerf het, benut. Fyn-afstemming stel die model in staat om meer akkurate en relevante resultate in gespesialiseerde toepassings te lewer sonder die behoefte om 'n nuwe model van nuuts af op te lei. > [!TIP] -> Aangesien dit redelik duur is om 'n LLM wat die teks "begryp" vooraf te leer, is dit gewoonlik makliker en goedkoper om oopbron vooraf-geleerde modelle fyn-af te stem om 'n spesifieke taak uit te voer wat ons wil hê dit moet uitvoer. +> Aangesien dit redelik duur is om 'n LLM wat "begrip" het van die teks vooraf te leer, is dit gewoonlik makliker en goedkoper om oopbron vooraf-geleerde modelle fyn-af te stem om 'n spesifieke taak uit te voer wat ons wil hê dit moet uitvoer. > [!TIP] > Die doel van hierdie afdeling is om te wys hoe om 'n reeds vooraf-geleerde model fyn-af te stem sodat die LLM, in plaas daarvan om nuwe teks te genereer, die **waarskynlikhede van die gegewe teks wat in elkeen van die gegewe kategorieë gekategoriseer word** (soos of 'n teks spam is of nie) sal gee. ## Voorbereiding van die dataset -### Dataset grootte +### Datasetgrootte -Natuurlik, om 'n model fyn-af te stem, benodig jy 'n paar gestruktureerde data om jou LLM te spesialiseer. In die voorbeeld wat voorgestel word in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), word GPT2 fyn-afgestem om te detecteer of 'n e-pos spam is of nie met die data van [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._ +Natuurlik, om 'n model fyn-af te stem, het jy 'n paar gestruktureerde data nodig om jou LLM te spesialiseer. In die voorbeeld wat voorgestel word in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), word GPT2 fyn-afgestem om te detecteer of 'n e-pos spam is of nie met die data van [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._ Hierdie dataset bevat baie meer voorbeelde van "nie spam" as van "spam", daarom stel die boek voor om **slegs soveel voorbeelde van "nie spam" as van "spam" te gebruik** (daarom, om al die ekstra voorbeelde uit die opleidingsdata te verwyder). In hierdie geval was dit 747 voorbeelde van elkeen. Toe, **70%** van die dataset word gebruik vir **opleiding**, **10%** vir **validasie** en **20%** vir **toetsing**. - Die **validasieset** word tydens die opleidingsfase gebruik om die model se **hiperparameters** fyn-af te stem en besluite te neem oor modelargitektuur, wat effektief help om oorpassing te voorkom deur terugvoer te gee oor hoe die model presteer op ongekende data. Dit stel iteratiewe verbeterings in staat sonder om die finale evaluasie te bevoordeel. -- Dit beteken dat alhoewel die data wat in hierdie dataset ingesluit is nie direk vir die opleiding gebruik word nie, dit gebruik word om die beste **hiperparameters** te stem, so hierdie stel kan nie gebruik word om die model se prestasie te evalueer soos die toetsstel nie. -- In teenstelling hiermee, die **toetsstel** word **slegs na** die model ten volle opgelei is en al die aanpassings voltooi is, gebruik; dit bied 'n onbevooroordeelde beoordeling van die model se vermoë om te generaliseer na nuwe, ongekende data. Hierdie finale evaluasie op die toetsstel gee 'n realistiese aanduiding van hoe die model verwag word om in werklike toepassings te presteer. +- Dit beteken dat alhoewel die data wat in hierdie dataset ingesluit is nie direk vir die opleiding gebruik word nie, dit gebruik word om die beste **hiperparameters** te stem, so hierdie stel kan nie gebruik word om die prestasie van die model te evalueer soos die toets een nie. +- In teenstelling hiermee, die **toetsstel** word **slegs na** die model volledig opgelei is en al die aanpassings voltooi is, gebruik; dit bied 'n onbevooroordeelde beoordeling van die model se vermoë om te generaliseer na nuwe, ongekende data. Hierdie finale evaluasie op die toetsstel gee 'n realistiese aanduiding van hoe die model verwag word om in werklike toepassings te presteer. -### Inskrywings lengte +### Inskrywingslengte Aangesien die opleidingsvoorbeeld inskrywings (e-pos teks in hierdie geval) van dieselfde lengte verwag, is daar besluit om elke inskrywing so groot te maak soos die grootste een deur die id's van `<|endoftext|>` as opvulling by te voeg. @@ -34,9 +34,9 @@ Aangesien die opleidingsvoorbeeld inskrywings (e-pos teks in hierdie geval) van Gebruik die oopbron vooraf-geleerde gewigte om die model te begin oplei. Ons het dit al voorheen gedoen en volg die instruksies van [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) kan jy dit maklik doen. -## Kategorisering kop +## Kategoriseringskop -In hierdie spesifieke voorbeeld (voorspel of 'n teks spam is of nie), is ons nie geïnteresseerd in fyn-afstemming volgens die volledige woordeskat van GPT2 nie, maar ons wil net hê die nuwe model moet sê of die e-pos spam is (1) of nie (0). Daarom gaan ons die **laaste laag wat** die waarskynlikhede per token van die woordeskat gee, aanpas vir een wat slegs die waarskynlikhede van spam of nie spam gee (soos 'n woordeskat van 2 woorde). +In hierdie spesifieke voorbeeld (voorspel of 'n teks spam is of nie), is ons nie geïnteresseerd in fyn-afstemming volgens die volledige woordeskat van GPT2 nie, maar ons wil net hê die nuwe model moet sê of die e-pos spam is (1) of nie (0). Daarom gaan ons die **laaste laag wat** die waarskynlikhede per token van die woordeskat gee, aanpas na een wat slegs die waarskynlikhede van spam of nie spam gee (soos 'n woordeskat van 2 woorde). ```python # This code modified the final layer with a Linear one with 2 outs num_classes = 2 @@ -66,7 +66,7 @@ param.requires_grad = True ``` ## Entries to use for training -In vorige afdelings is die LLM opgelei deur die verlies van elke voorspelde token te verminder, alhoewel byna al die voorspelde tokens in die invoer sin was (slegs 1 aan die einde was werklik voorspel) sodat die model die taal beter kan verstaan. +In vorige afdelings is die LLM opgelei deur die verlies van elke voorspelde token te verminder, alhoewel byna al die voorspelde tokens in die invoer sin was (slegs 1 aan die einde was regtig voorspel) sodat die model die taal beter kan verstaan. In hierdie geval is ons net geïnteresseerd in die model se vermoë om te voorspel of die model spam is of nie, so ons is net geïnteresseerd in die laaste voorspelde token. Daarom is dit nodig om ons vorige opleidingsverlies funksies te wysig om slegs daardie token in ag te neem. @@ -111,4 +111,4 @@ Jy kan al die kode vind om GPT2 te fyn-afstem om 'n spam klassifiseerder te wees - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index f4bb9ed14..50755011d 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,13 +1,13 @@ -# 7.2. Fyn-afstelling om instruksies te volg +# 7.2. Fyn-afstemming om instruksies te volg -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} > [!TIP] -> Die doel van hierdie afdeling is om te wys hoe om 'n **reeds vooropgestelde model fyn af te stel om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take as 'n chat bot te reageer. +> Die doel van hierdie afdeling is om te wys hoe om 'n **reeds vooropgeleide model fyn af te stem om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take as 'n chat bot te reageer. ## Dataset -Om 'n LLM fyn af te stel om instruksies te volg, is dit nodig om 'n dataset met instruksies en antwoorde te hê om die LLM fyn af te stel. Daar is verskillende formate om 'n LLM op te lei om instruksies te volg, byvoorbeeld: +Om 'n LLM fyn af te stem om instruksies te volg, is dit nodig om 'n dataset met instruksies en antwoorde te hê om die LLM fyn af te stem. Daar is verskillende formate om 'n LLM op te lei om instruksies te volg, byvoorbeeld: - Die Apply Alpaca prompt styl voorbeeld: ```csharp @@ -29,9 +29,9 @@ Can you explain what gravity is in simple terms? <|Assistant|> Absolutely! Gravity is a force that pulls objects toward each other. ``` -Training a LLM met hierdie soort datastelle in plaas van net rou teks help die LLM om te verstaan dat hy spesifieke antwoorde op die vrae wat hy ontvang, moet gee. +Die opleiding van 'n LLM met hierdie soort datastelle in plaas van net rou teks help die LLM om te verstaan dat hy spesifieke antwoorde op die vrae wat hy ontvang, moet gee. -Daarom is een van die eerste dinge om te doen met 'n dataset wat versoeke en antwoorde bevat, om daardie data in die gewenste promptformaat te modelleer, soos: +Daarom is een van die eerste dinge om te doen met 'n datastel wat versoeke en antwoorde bevat, om daardie data in die gewenste promptformaat te modelleer, soos: ```python # Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb def format_input(entry): @@ -58,7 +58,7 @@ Then, soos altyd, is dit nodig om die dataset in stelle vir opleiding, validasie Dan is dit nodig om al die insette en verwagte uitsette vir die opleiding in batches te plaas. Hiervoor is dit nodig om: - Tokenize die teks -- Vul al die monsters tot dieselfde lengte (gewoonlik sal die lengte so groot wees soos die kontekslengte wat gebruik is om die LLM voor te leer) +- Vul al die monsters tot dieselfde lengte (gewoonlik sal die lengte so groot wees soos die kontekslengte wat gebruik is om die LLM voor te oefen) - Skep die verwagte tokens deur die inset met 1 in 'n pasgemaakte collate-funksie te skuif - Vervang sommige padding tokens met -100 om hulle van die opleidingsverlies uit te sluit: Na die eerste `endoftext` token, vervang al die ander `endoftext` tokens met -100 (want die gebruik van `cross_entropy(...,ignore_index=-100)` beteken dat dit teikens met -100 sal ignoreer) - \[Opsioneel\] Masker met -100 ook al die tokens wat aan die vraag behoort sodat die LLM net leer hoe om die antwoord te genereer. In die Apply Alpaca styl sal dit beteken om alles te masker tot `### Response:` @@ -81,15 +81,15 @@ Ander toetse om te loop om die kwaliteit van die antwoorde te verifieer: 1. **Meet Massiewe Multitask Taalbegrip (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evalueer 'n model se kennis en probleemoplossingsvermoëns oor 57 vakke, insluitend menswetenskappe, wetenskappe, en meer. Dit gebruik meerkeuse vrae om begrip op verskillende moeilikheidsvlakke te assesseer, van elementêr tot gevorderd professioneel. 2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): Hierdie platform laat gebruikers toe om antwoorde van verskillende chatbots langs mekaar te vergelyk. Gebruikers voer 'n prompt in, en verskeie chatbots genereer antwoorde wat direk vergelyk kan word. -3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval is 'n geoutomatiseerde evalueringsraamwerk waar 'n gevorderde LLM soos GPT-4 die antwoorde van ander modelle op verskillende prompts evalueer. -4. **Algemene Taalbegrip Evaluasie (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE is 'n versameling van nege natuurlike taalbegrip take, insluitend sentimentanalise, teksafleiding, en vraagbeantwoording. +3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval is 'n geoutomatiseerde evaluasieraamwerk waar 'n gevorderde LLM soos GPT-4 die antwoorde van ander modelle op verskeie prompts evalueer. +4. **Algemene Taalbegrip Evaluasie (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE is 'n versameling van nege natuurlike taalbegrip take, insluitend sentimentanalise, teksimplikasie, en vraagbeantwoording. 5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** Gebaseer op GLUE, sluit SuperGLUE meer uitdagende take in wat ontwerp is om moeilik te wees vir huidige modelle. -6. **Buiten die Imitasie Speletjie Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench is 'n groot skaal benchmark met meer as 200 take wat 'n model se vermoëns in areas soos redeneer, vertaling, en vraagbeantwoording toets. +6. **Buiten die Imitasie Speletjie Benchmark (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench is 'n grootmaat benchmark met meer as 200 take wat 'n model se vermoëns in areas soos redeneer, vertaling, en vraagbeantwoording toets. 7. **Holistiese Evaluasie van Taalmodelle (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM bied 'n omvattende evaluasie oor verskeie metrieks soos akkuraatheid, robuustheid, en billikheid. -8. [**OpenAI Evals**](https://github.com/openai/evals)**:** 'n oopbron evalueringsraamwerk deur OpenAI wat toelaat vir die toetsing van KI-modelle op pasgemaakte en gestandaardiseerde take. +8. [**OpenAI Evals**](https://github.com/openai/evals)**:** 'n Oopbron evaluasieraamwerk deur OpenAI wat toelaat dat AI-modelle op pasgemaakte en gestandaardiseerde take getoets word. 9. [**HumanEval**](https://github.com/openai/human-eval)**:** 'n Versameling programmeringsprobleme wat gebruik word om die kodegenereringsvermoëns van taalmodelle te evalueer. 10. **Stanford Vraagbeantwoording Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD bestaan uit vrae oor Wikipedia-artikels, waar modelle die teks moet verstaan om akkuraat te antwoord. -11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 'n Groot skaal dataset van trivia vrae en antwoorde, saam met bewysdokumente. +11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 'n Grootmaat dataset van trivia vrae en antwoorde, saam met bewysdokumente. en baie baie meer @@ -101,4 +101,4 @@ Jy kan 'n voorbeeld van die kode om hierdie fyn afstemming uit te voer vind in [ - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index c593e1020..8dab87acb 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,6 +1,6 @@ # LLM Opleiding - Data Voorbereiding -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} **Dit is my aantekeninge uit die baie aanbevole boek** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **met 'n paar ekstra inligting.** @@ -33,7 +33,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet ## 3. Token Inbedings > [!TIP] -> Die doel van hierdie derde fase is baie eenvoudig: **Ken elkeen van die vorige tokens in die woordeskat 'n vektor van die verlangde dimensies toe om die model op te lei.** Elke woord in die woordeskat sal 'n punt in 'n ruimte van X dimensies wees.\ +> Die doel van hierdie derde fase is baie eenvoudig: **Ken elkeen van die vorige tokens in die woordeskat 'n vektor van die verlangde dimensies toe om die model te oefen.** Elke woord in die woordeskat sal 'n punt in 'n ruimte van X dimensies wees.\ > Let daarop dat die posisie van elke woord in die ruimte aanvanklik net "ewekansig" geinitialiseer word en dat hierdie posisies opleibare parameters is (sal verbeter word tydens die opleiding). > > Boonop, tydens die token inbedding **word 'n ander laag van inbeddings geskep** wat (in hierdie geval) die **absolute posisie van die woord in die opleidingssin** verteenwoordig. Op hierdie manier sal 'n woord in verskillende posisies in die sin 'n ander voorstelling (betekenis) hê. @@ -46,7 +46,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet > [!TIP] > Die doel van hierdie vierde fase is baie eenvoudig: **Pas 'n paar aandag meganismes toe**. Hierdie gaan baie **herhaalde lae** wees wat die **verhouding van 'n woord in die woordeskat met sy bure in die huidige sin wat gebruik word om die LLM op te lei, vasvang**.\ -> 'n Groot aantal lae word hiervoor gebruik, so 'n groot aantal opleibare parameters gaan hierdie inligting vasvang. +> 'n Baie lae word hiervoor gebruik, so 'n baie opleibare parameters gaan hierdie inligting vasvang. {{#ref}} 4.-attention-mechanisms.md @@ -66,7 +66,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet ## 6. Vooropleiding & Laai modelle > [!TIP] -> Die doel van hierdie sesde fase is baie eenvoudig: **Oplei die model van nuuts af**. Hiervoor sal die vorige LLM argitektuur gebruik word met 'n paar lusse wat oor die datastelle gaan met behulp van die gedefinieerde verliesfunksies en optimizer om al die parameters van die model op te lei. +> Die doel van hierdie sesde fase is baie eenvoudig: **Oefen die model van nuuts af**. Hiervoor sal die vorige LLM argitektuur gebruik word met 'n paar lusse wat oor die datastelle gaan met die gedefinieerde verliesfunksies en optimizer om al die parameters van die model op te lei. {{#ref}} 6.-pre-training-and-loading-models.md @@ -84,7 +84,7 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet ## 7.1. Fyn-Afstemming vir Kategorisering > [!TIP] -> Die doel van hierdie afdeling is om te wys hoe om 'n reeds vooropgeleide model fyn af te stel sodat in plaas daarvan om nuwe teks te genereer, die LLM die **waarskynlikhede van die gegewe teks om in elkeen van die gegewe kategorieë gekategoriseer te word** (soos of 'n teks spam is of nie) sal gee. +> Die doel van hierdie afdeling is om te wys hoe om 'n reeds vooropgeleide model fyn af te stel sodat in plaas daarvan om nuwe teks te genereer, die LLM die **waarskynlikhede van die gegewe teks wat in elkeen van die gegewe kategorieë gekategoriseer word** (soos of 'n teks spam is of nie) sal gee. {{#ref}} 7.1.-fine-tuning-for-classification.md @@ -93,10 +93,10 @@ Jy moet begin deur hierdie pos te lees vir 'n paar basiese konsepte wat jy moet ## 7.2. Fyn-Afstemming om instruksies te volg > [!TIP] -> Die doel van hierdie afdeling is om te wys hoe om **'n reeds vooropgeleide model fyn af te stel om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take as 'n chat bot te reageer. +> Die doel van hierdie afdeling is om te wys hoe om **'n reeds vooropgeleide model fyn af te stel om instruksies te volg** eerder as net teks te genereer, byvoorbeeld, om op take te reageer as 'n chat bot. {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index 565a9300e..37a69920c 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1,3 +1,3 @@ -# Arbitrêre Skrywe 2 Exec +# Arbitrary Write 2 Exec -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md index 41dad7f28..da0caecf8 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md @@ -8,7 +8,7 @@ ## Kwetsbare Kode -Die kwesbare funksie lees en nulmaak 16 bytes wat begin vanaf 'n aanvaller-beheerde offset sonder om te verseker dat dit binne die toegewyde buffer lê: +Die kwesbare funksie lees en stel 16 bytes nul vanaf 'n aanvaller-beheerde offset sonder om te verseker dat dit binne die toegewyde buffer lê: ```c // Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1) for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) { @@ -30,7 +30,7 @@ Slegs 'n kontrole `offsetToCLUT <= totalDataLength` word uitgevoer. Deur `offset sips --verifyColor malicious.icc ``` -3. **Heap metadata korrupsie:** Die OOB nul-skrywings oorskryf allokator metadata of aangrensende wysers, wat die aanvaller in staat stel om die vloei van beheer te kapen en arbitrêre kode-uitvoering in die konteks van die `sips` proses te bereik. +3. **Heap metadata korrupsie:** Die OOB nul-skrywings oorskryf allokator metadata of aangrensende wysers, wat die aanvaller in staat stel om die vloei van beheer te kapen en arbitrêre kode-uitvoering te bereik in die konteks van die `sips` proses. ## Impak @@ -39,7 +39,7 @@ Suksesvolle eksploitatie lei tot afstandelike arbitrêre kode-uitvoering met geb ## Opsporing - Monitor lêer oordragte op algemene protokolle (FTP, HTTP/S, IMAP, SMB, NFS, SMTP). -- Inspekteer oorgedra lêers met handtekening `acsp`. +- Ondersoek oorgedra lêers met handtekening `acsp`. - Vir elke `mAB ` of `mBA ` tag, verifieer of die `Offset to CLUT` veld gelyk is aan die `Tag data size`. - Merk as verdag indien hierdie voorwaarde nagekom word. @@ -50,4 +50,4 @@ https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulner - Apple Oktober 2024 Sekuriteitsopdatering (patch wat CVE-2024-44236 verskaf) https://support.apple.com/en-us/121564 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/array-indexing.md b/src/binary-exploitation/array-indexing.md index c56735e7e..66eb84354 100644 --- a/src/binary-exploitation/array-indexing.md +++ b/src/binary-exploitation/array-indexing.md @@ -11,10 +11,10 @@ Hier kan jy egter 'n paar mooi **voorbeelde** vind: - [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html) - Daar is **2 botsende arrays**, een vir **adresse** waar data gestoor word en een met die **groottes** van daardie data. Dit is moontlik om een van die ander te oorskryf, wat dit moontlik maak om 'n arbitrêre adres aan te dui as 'n grootte. Dit stel jou in staat om die adres van die `free` funksie in die GOT tabel te skryf en dit dan te oorskryf met die adres na `system`, en `free` vanaf 'n geheue met `/bin/sh` aan te roep. - [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html) -- 64 bits, geen nx. Oorskry 'n grootte om 'n tipe buffer overflow te kry waar alles as 'n dubbele getal gebruik gaan word en gesorteer word van kleinste na grootste, so dit is nodig om 'n shellcode te skep wat aan daardie vereiste voldoen, met inagneming dat die canary nie van sy posisie verplaas moet word nie en uiteindelik die RIP oorskryf met 'n adres na ret, wat aan die vorige vereistes voldoen en die grootste adres 'n nuwe adres wat na die begin van die stapel wys (geleek deur die program) sodat dit moontlik is om die ret te gebruik om daarheen te spring. +- 64 bits, geen nx. Oorskry 'n grootte om 'n tipe buffer overflow te kry waar alles as 'n dubbele getal gebruik gaan word en gesorteer word van die kleinste na die grootste, so dit is nodig om 'n shellcode te skep wat aan daardie vereiste voldoen, met inagneming dat die canary nie van sy posisie verplaas moet word nie en uiteindelik die RIP oorskryf met 'n adres na ret, wat aan die vorige vereistes voldoen en die grootste adres 'n nuwe adres wat na die begin van die stapel wys (geleek deur die program) sodat dit moontlik is om die ret te gebruik om daarheen te spring. - [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/) - 64bits, geen relro, canary, nx, geen pie. Daar is 'n off-by-one in 'n array in die stapel wat dit moontlik maak om 'n pointer te beheer wat WWW toeken. (dit skryf die som van al die getalle van die array in die oorskryfde adres deur die off-by-one in die array). Die stapel is beheer, sodat die GOT `exit` adres oorskryf word met `pop rdi; ret`, en in die stapel word die adres na `main` bygevoeg (terugloop na `main`). 'n ROP-ketting om die adres van put in die GOT te lek met behulp van puts word gebruik (`exit` sal aangeroep word, so dit sal `pop rdi; ret` aanroep, wat hierdie ketting in die stapel uitvoer). Uiteindelik word 'n nuwe ROP-ketting wat ret2lib uitvoer, gebruik. - [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html) - 32 bit, geen relro, geen canary, nx, pie. Misbruik 'n slegte indeksering om adresse van libc en heap vanaf die stapel te lek. Misbruik die buffer overflow om 'n ret2lib aan te roep wat `system('/bin/sh')` aanroep (die heap adres is nodig om 'n kontrole te omseil). -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md index 6c32e8486..e7a6cdd65 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md @@ -2,19 +2,19 @@ {{#include ../../../banners/hacktricks-training.md}} -**As jy 'n binêre teëkom wat deur 'n kanarie en PIE (Posisie Onafhanklike Uitvoerbare) beskerm word, moet jy waarskynlik 'n manier vind om dit te omseil.** +**As jy 'n binêre teenkom wat deur 'n kanarie en PIE (Posisie Onafhanklike Uitvoerbare) beskerm word, moet jy waarskynlik 'n manier vind om dit te omseil.** ![](<../../../images/image (865).png>) > [!TIP] > Let daarop dat **`checksec`** dalk nie sal vind dat 'n binêre deur 'n kanarie beskerm word nie as dit staties gecompileer is en nie in staat is om die funksie te identifiseer nie.\ -> Jy kan egter dit handmatig opgemerk as jy vind dat 'n waarde in die stapel gestoor word aan die begin van 'n funksie-aanroep en hierdie waarde voor die uitgang nagegaan word. +> Jy kan egter dit handmatig opgemerk as jy vind dat 'n waarde in die stapel gestoor word aan die begin van 'n funksie-aanroep en hierdie waarde word nagegaan voordat dit verlaat. ## Brute force Kanarie -Die beste manier om 'n eenvoudige kanarie te omseil, is as die binêre 'n program is wat **kindproses elke keer fork wanneer jy 'n nuwe verbinding met dit maak** (netwerkdiens), want elke keer as jy met dit verbind, **sal dieselfde kanarie gebruik word**. +Die beste manier om 'n eenvoudige kanarie te omseil is as die binêre 'n program is wat **kindproses elke keer fork wanneer jy 'n nuwe verbinding met dit maak** (netwerkdiens), want elke keer as jy met dit verbind, **sal dieselfde kanarie gebruik word**. -Dan is die beste manier om die kanarie te omseil net om dit **brute-force per karakter** te doen, en jy kan uitvind of die geraamde kanarie-byte korrek was deur te kyk of die program gecrash het of sy gewone vloei voortgaan. In hierdie voorbeeld **brute-forseert die funksie 'n 8 Bytes kanarie (x64)** en onderskei tussen 'n korrek geraamde byte en 'n slegte byte net deur **te kyk** of 'n **antwoord** deur die bediener teruggestuur word (nog 'n manier in **ander situasie** kan wees om 'n **try/except** te gebruik): +Dan is die beste manier om die kanarie te omseil net om dit **brute-force te doen karakter vir karakter**, en jy kan uitvind of die geraamde kanarie-byte korrek was deur te kyk of die program gecrash het of sy gewone vloei voortgaan. In hierdie voorbeeld **brute-forseert die funksie 'n 8 Bytes kanarie (x64)** en onderskei tussen 'n korrek geraamde byte en 'n slegte byte net deur **te kyk** of 'n **antwoord** deur die bediener teruggestuur word (nog 'n manier in **ander situasie** kan wees om 'n **try/except** te gebruik): ### Voorbeeld 1 @@ -59,8 +59,8 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary ``` ### Voorbeeld 2 -Dit is geïmplementeer vir 32-bis, maar dit kan maklik verander word na 64-bis.\ -Let ook daarop dat die **program eerstens 'n byte verwag om die grootte van die invoer** en die payload aan te dui. +Dit is geïmplementeer vir 32 bits, maar dit kan maklik verander word na 64 bits.\ +Let ook daarop dat die **program verwag eers 'n byte om die grootte van die invoer aan te dui** en die payload. ```python from pwn import * @@ -105,11 +105,11 @@ log.info(f"The canary is: {canary}") Drade van dieselfde proses sal ook **diezelfde canary-token deel**, daarom sal dit moontlik wees om 'n canary te **brute-forc**e as die binêre 'n nuwe draad genereer elke keer as 'n aanval plaasvind. -Boonop kan 'n buffer **overflow in 'n gedrade funksie** wat met canary beskerm word, gebruik word om die **master canary wat in die TLS gestoor is, te wysig**. Dit is omdat dit moontlik mag wees om die geheueposisie te bereik waar die TLS gestoor is (en dus, die canary) via 'n **bof in die stapel** van 'n draad.\ -As gevolg hiervan is die mitigering nutteloos omdat die kontrole gebruik word met twee canaries wat dieselfde is (alhoewel gewysig).\ -Hierdie aanval word in die skrywe uitgevoer: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) +Boonop kan 'n buffer **overflow in 'n gedrade funksie** wat met canary beskerm word, gebruik word om die **meester canary wat in die TLS gestoor is, te wysig**. Dit is omdat dit moontlik mag wees om die geheueposisie te bereik waar die TLS gestoor is (en dus, die canary) via 'n **bof in die stapel** van 'n draad.\ +As gevolg hiervan is die mitigasie nutteloos omdat die kontrole gebruik word met twee canaries wat dieselfde is (alhoewel gewysig).\ +Hierdie aanval word uitgevoer in die skrywe: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -Kyk ook na die aanbieding van [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) wat noem dat die **TLS** gewoonlik gestoor word deur **`mmap`** en wanneer 'n **stapel** van **draad** geskep word, dit ook deur `mmap` gegenereer word volgens dit, wat die overflow mag toelaat soos in die vorige skrywe gewys. +Kyk ook na die aanbieding van [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) wat noem dat gewoonlik die **TLS** gestoor word deur **`mmap`** en wanneer 'n **stapel** van **draad** geskep word, dit ook deur `mmap` gegenereer word volgens dit, wat die overflow mag toelaat soos in die vorige skrywe gewys. ## Ander voorbeelde & verwysings @@ -119,4 +119,4 @@ Kyk ook na die aanbieding van [https://www.slideshare.net/codeblue_jp/master-can -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index 5bd0bdd95..1738a3766 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,6 +1,6 @@ # iOS Exploiting -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## Fisiese gebruik-na-vry @@ -18,8 +18,8 @@ Bladsy tabelle is hiërargies georganiseer in drie vlakke: * Elke inskrywing hier verteenwoordig 'n groot reeks van virtuele geheue. * Dit dek **0x1000000000 bytes** (of **256 GB**) van virtuele geheue. 2. **L2 Bladsy Tabel (Vlak 2)**: -* 'n Inskrywing hier verteenwoordig 'n kleiner gebied van virtuele geheue, spesifiek **0x2000000 bytes** (32 MB). -* 'n L1 inskrywing kan na 'n L2 tabel verwys as dit nie die hele gebied self kan kaart nie. +* 'n Inskrywing hier verteenwoordig 'n kleiner streek van virtuele geheue, spesifiek **0x2000000 bytes** (32 MB). +* 'n L1 inskrywing kan na 'n L2 tabel verwys as dit nie die hele streek self kan kaart nie. 3. **L3 Bladsy Tabel (Vlak 3)**: * Dit is die fynste vlak, waar elke inskrywing 'n enkele **4 KB** geheue bladsy kaart. * 'n L2 inskrywing kan na 'n L3 tabel verwys as meer fyn beheer nodig is. @@ -38,7 +38,7 @@ Kom ons sê jy probeer om toegang te verkry tot die virtuele adres **0x100000000 1. **L1 Tabel**: * Die kernel kyk na die L1 bladsy tabel inskrywing wat ooreenstem met hierdie virtuele adres. As dit 'n **wys na 'n L2 bladsy tabel** het, gaan dit na daardie L2 tabel. 2. **L2 Tabel**: -* Die kernel kyk na die L2 bladsy tabel vir 'n meer gedetailleerde kaarting. As hierdie inskrywing na 'n **L3 bladsy tabel** verwys, gaan dit daarheen. +* Die kernel kyk na die L2 bladsy tabel vir 'n meer gedetailleerde kaarting. As hierdie inskrywing na 'n **L3 bladsy tabel** verwys, gaan dit daar voort. 3. **L3 Tabel**: * Die kernel soek die finale L3 inskrywing, wat na die **fisiese adres** van die werklike geheue bladsy verwys. @@ -59,7 +59,7 @@ Alternatiewelik, as die L2 inskrywing na 'n L3 tabel verwys: 1. 'n Proses **toewys** 'n bietjie geheue as **leesbaar en skryfbaar**. 2. Die **bladsy tabelle** word opgedateer om hierdie geheue na 'n spesifieke fisiese adres te kaart wat die proses kan toegang. -3. Die proses **deallocate** (vry) die geheue. +3. Die proses **deallokeer** (vry) die geheue. 4. Maar, as gevolg van 'n **fout**, vergeet die kernel om die kaarting uit die bladsy tabelle te verwyder, alhoewel dit die ooreenstemmende fisiese geheue as vry merk. 5. Die kernel kan dan **hertoewys hierdie "vrygemaakte" fisiese geheue** vir ander doeleindes, soos **kernel data**. 6. Aangesien die kaarting nie verwyder is nie, kan die proses steeds **lees en skryf** na hierdie fisiese geheue. @@ -73,7 +73,7 @@ Aangesien die aanvaller nie kan beheer watter spesifieke kernel bladsye aan vryg 1. Die aanvaller **skep 'n groot aantal IOSurface-objekte** in kernel geheue. 2. Elke IOSurface-objek bevat 'n **magiese waarde** in een van sy velde, wat dit maklik maak om te identifiseer. 3. Hulle **skandeer die vrygemaakte bladsye** om te sien of enige van hierdie IOSurface-objekte op 'n vrygemaakte bladsy beland het. -4. Wanneer hulle 'n IOSurface-objek op 'n vrygemaakte bladsy vind, kan hulle dit gebruik om **te lees en te skryf na kernel geheue**. +4. Wanneer hulle 'n IOSurface-objek op 'n vrygemaakte bladsy vind, kan hulle dit gebruik om **kernel geheue te lees en te skryf**. Meer inligting hieroor in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) @@ -81,11 +81,11 @@ Meer inligting hieroor in [https://github.com/felix-pb/kfd/tree/main/writeups](h 1. **Spray IOSurface-Objekte**: Die aanvaller skep baie IOSurface-objekte met 'n spesiale identifiseerder ("magiese waarde"). 2. **Skandeer Vrygemaakte Bladsye**: Hulle kyk of enige van die objekke op 'n vrygemaakte bladsy toegeken is. -3. **Lees/Skryf Kernel Geheue**: Deur velde in die IOSurface-objek te manipuleer, verkry hulle die vermoë om **arbitraire lees en skryf** in kernel geheue uit te voer. Dit laat hulle toe: -* Gebruik een veld om **enige 32-bit waarde** in kernel geheue te lees. -* Gebruik 'n ander veld om **64-bit waardes** te skryf, wat 'n stabiele **kernel lees/skryf primitief** bereik. +3. **Lees/Skryf Kernel Geheue**: Deur velde in die IOSurface-objek te manipuleer, verkry hulle die vermoë om **arbitraire lees en skryf** in kernel geheue uit te voer. Dit laat hulle toe om: +* Een veld te gebruik om **enige 32-bit waarde** in kernel geheue te lees. +* 'n Ander veld te gebruik om **64-bit waardes** te skryf, wat 'n stabiele **kernel lees/skryf primitief** bereik. -Genereer IOSurface-objekte met die magiese waarde IOSURFACE\_MAGIC om later vir te soek: +Genereer IOSurface-objekte met die magiese waarde IOSURFACE\_MAGIC om later te soek: ```c void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { if (*nClients >= 0x4000) return; @@ -151,13 +151,13 @@ Die IOSurface objek het twee belangrike velde: 1. **Gebruik Tel Punter**: Laat 'n **32-bit lees** toe. 2. **Geverifieerde Tydstempel Punter**: Laat 'n **64-bit skryf** toe. -Deur hierdie punters te oorskryf, lei ons hulle na arbitraire adresse in kernel geheue, wat lees/skryf vermoëns moontlik maak. +Deur hierdie punters te oorskryf, lei ons dit na arbitraire adresse in kernel geheue, wat lees/skryf vermoëns moontlik maak. #### 32-Bit Kernel Lees Om 'n lees uit te voer: -1. Oorskryf die **gebruik tel punter** om na die teikenadres minus 'n 0x14-byt offset te wys. +1. Oorskryf die **gebruik tel punter** om na die teiken adres minus 'n 0x14-byte offset te wys. 2. Gebruik die `get_use_count` metode om die waarde op daardie adres te lees. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -176,9 +176,9 @@ iosurface_set_use_count_pointer(info.object, orig); return value; } ``` -#### 64-Bit Kernel Skryf +#### 64-Bit Kernel Write -Om 'n skryf te doen: +Om 'n skrywe uit te voer: 1. Oorskryf die **geïndekseerde tydstempel-aanwyser** na die teikenadres. 2. Gebruik die `set_indexed_timestamp` metode om 'n 64-bit waarde te skryf. @@ -204,5 +204,4 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); With these primitives, the exploit provides controlled **32-bit reads** and **64-bit writes** to kernel memory. Further jailbreak steps could involve more stable read/write primitives, which may require bypassing additional protections (e.g., PPL on newer arm64e devices). - -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index 193e9a751..697f64a95 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,6 +1,6 @@ # Libc Heap -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Heap Basics @@ -12,18 +12,18 @@ Soos getoon, is dit net na waar die binêre in geheue gelaai word (kyk die `[hea ### Basic Chunk Allocation -Wanneer sekere data versoek word om in die heap gestoor te word, word 'n gedeelte van die heap aan dit toegeken. Hierdie ruimte behoort aan 'n bin en slegs die versoekte data + die ruimte van die bin koppe + minimum bin grootte offset sal gereserveer word vir die chunk. Die doel is om slegs die minimum geheue te reserveer sonder om dit moeilik te maak om te vind waar elke chunk is. Hiervoor word die metadata chunk inligting gebruik om te weet waar elke gebruikte/vrye chunk is. +Wanneer daar data aangevra word om in die heap gestoor te word, word 'n stuk ruimte in die heap aan dit toegeken. Hierdie ruimte behoort aan 'n bin en slegs die aangevraagde data + die ruimte van die bin kopstukke + minimum bin grootte offset sal gereserveer word vir die chunk. Die doel is om slegs die minimum geheue te reserveer sonder om dit moeilik te maak om te vind waar elke chunk is. Hiervoor word die metadata chunk inligting gebruik om te weet waar elke gebruikte/vrye chunk is. Daar is verskillende maniere om die ruimte te reserveer, hoofsaaklik afhangende van die gebruikte bin, maar 'n algemene metodologie is die volgende: - Die program begin deur 'n sekere hoeveelheid geheue aan te vra. -- As daar in die lys van chunks iemand beskikbaar is groot genoeg om die versoek te vervul, sal dit gebruik word. -- Dit kan selfs beteken dat 'n deel van die beskikbare chunk vir hierdie versoek gebruik sal word en die res aan die chunks lys bygevoeg sal word. +- As daar in die lys van chunks iemand beskikbaar groot genoeg is om die aanvraag te vervul, sal dit gebruik word. +- Dit kan selfs beteken dat 'n deel van die beskikbare chunk vir hierdie aanvraag gebruik sal word en die res aan die chunks lys bygevoeg sal word. - As daar nie enige beskikbare chunk in die lys is nie, maar daar steeds ruimte in die toegeken geheue is, skep die heap bestuurder 'n nuwe chunk. - As daar nie genoeg heap ruimte is om die nuwe chunk toe te ken nie, vra die heap bestuurder die kernel om die geheue wat aan die heap toegeken is, uit te brei en gebruik dan hierdie geheue om die nuwe chunk te genereer. - As alles misluk, keer `malloc` null terug. -Let daarop dat as die versoekte **geheue 'n drempel oorskry**, **`mmap`** gebruik sal word om die versoekte geheue te kaart. +Let daarop dat as die aangevraagde **geheue 'n drempel oorskry**, **`mmap`** gebruik sal word om die aangevraagde geheue te kaart. ## Arenas @@ -31,7 +31,7 @@ In **multithreaded** toepassings moet die heap bestuurder **race conditions** vo Om dit aan te spreek, het die ptmalloc2 heap toewysingsprogram "arenas" bekendgestel, waar **elke arena** as 'n **afsonderlike heap** met sy **eie** data **strukture** en **mutex** optree, wat verskeie threads in staat stel om heap operasies uit te voer sonder om mekaar te steur, solank hulle verskillende arenas gebruik. -Die standaard "hoof" arena hanteer heap operasies vir enkel-draad toepassings. Wanneer **nuwe threads** bygevoeg word, ken die heap bestuurder hulle **sekondêre arenas** toe om mededinging te verminder. Dit probeer eers om elke nuwe thread aan 'n ongebruikte arena te koppel, en skep nuwe indien nodig, tot 'n limiet van 2 keer die aantal CPU-kerns vir 32-bis stelsels en 8 keer vir 64-bis stelsels. Sodra die limiet bereik is, **moet threads arenas deel**, wat tot potensiële mededinging lei. +Die standaard "hoof" arena hanteer heap operasies vir enkel-draad toepassings. Wanneer **nuwe threads** bygevoeg word, ken die heap bestuurder hulle **sekondêre arenas** toe om mededinging te verminder. Dit probeer eers om elke nuwe thread aan 'n ongebruikte arena te koppel, en skep nuwe as dit nodig is, tot 'n limiet van 2 keer die aantal CPU-kerns vir 32-bis stelsels en 8 keer vir 64-bis stelsels. Sodra die limiet bereik is, **moet threads arenas deel**, wat tot potensiële mededinging lei. In teenstelling met die hoof arena, wat uitbrei deur die `brk` stelselaanroep, skep sekondêre arenas "subheaps" deur `mmap` en `mprotect` te gebruik om die heap gedrag te simuleer, wat buigsaamheid in die bestuur van geheue vir multithreaded operasies toelaat. @@ -43,16 +43,16 @@ Subheaps dien as geheue voorrade vir sekondêre arenas in multithreaded toepassi - Die aanvanklike heap is direk na die program se binêre in geheue geleë, en dit brei uit deur die `sbrk` stelselaanroep. - Subheaps, wat deur sekondêre arenas gebruik word, word geskep deur `mmap`, 'n stelselaanroep wat 'n gespesifiseerde geheuegebied kaart. 2. **Geheue Reservasie met `mmap`**: -- Wanneer die heap bestuurder 'n subheap skep, reserveer dit 'n groot blok geheue deur `mmap`. Hierdie reservasie allokeer nie onmiddellik geheue nie; dit dui eenvoudig 'n gebied aan wat ander stelsels of toewysings nie moet gebruik nie. +- Wanneer die heap bestuurder 'n subheap skep, reserveer dit 'n groot blok geheue deur `mmap`. Hierdie reservasie allokeer nie onmiddellik geheue nie; dit dui eenvoudig 'n gebied aan wat ander stelsels of allokasies nie moet gebruik nie. - Standaard is die gereserveerde grootte vir 'n subheap 1 MB vir 32-bis prosesse en 64 MB vir 64-bis prosesse. 3. **Geleidelike Uitbreiding met `mprotect`**: - Die gereserveerde geheuegebied is aanvanklik gemerk as `PROT_NONE`, wat aandui dat die kernel nie fisiese geheue aan hierdie ruimte hoef toe te ken nie. - Om die subheap te "groei", gebruik die heap bestuurder `mprotect` om bladsy toestemmings van `PROT_NONE` na `PROT_READ | PROT_WRITE` te verander, wat die kernel aanmoedig om fisiese geheue aan die voorheen gereserveerde adresse toe te ken. Hierdie stap-vir-stap benadering laat die subheap toe om uit te brei soos nodig. -- Sodra die hele subheap uitgeput is, skep die heap bestuurder 'n nuwe subheap om voort te gaan met toewysing. +- Sodra die hele subheap uitgeput is, skep die heap bestuurder 'n nuwe subheap om voort te gaan met allokasie. ### heap_info -Hierdie struct allokeer relevante inligting van die heap. Boonop mag heap geheue nie aaneenlopend wees na meer toewysings nie, hierdie struct sal ook daardie inligting stoor. +Hierdie struct allokeer relevante inligting van die heap. Boonop mag heap geheue nie aaneenlopend wees na meer allokasies nie, hierdie struct sal ook daardie inligting stoor. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837 @@ -91,9 +91,9 @@ Daar is 'n paar interessante dinge om te noem van hierdie struktuur (sien C kode ``` - Die `mchunkptr bins[NBINS * 2 - 2];` bevat **pointers** na die **eerste en laaste chunks** van die klein, groot en onsorteerde **bins** (die -2 is omdat die indeks 0 nie gebruik word nie) -- Daarom sal die **eerste chunk** van hierdie bins 'n **terugwysende pointer na hierdie struktuur** hê en die **laaste chunk** van hierdie bins sal 'n **vorentoe wysende pointer** na hierdie struktuur hê. Wat basies beteken dat as jy kan **leak hierdie adresse in die hoof arena** jy 'n pointer na die struktuur in die **libc** sal hê. +- Daarom sal die **eerste chunk** van hierdie bins 'n **terugwysende pointer na hierdie struktuur** hê en die **laaste chunk** van hierdie bins sal 'n **vorentoe wysende pointer** na hierdie struktuur hê. Wat basies beteken dat as jy hierdie adresse in die **hoof arena** kan **leak**, jy 'n pointer na die struktuur in die **libc** sal hê. - Die structs `struct malloc_state *next;` en `struct malloc_state *next_free;` is verknopte lyste van arenas -- Die `top` chunk is die laaste "chunk", wat basies **alle heap herinnering ruimte** is. Sodra die top chunk "leeg" is, is die heap heeltemal gebruik en dit moet meer ruimte aan vra. +- Die `top` chunk is die laaste "chunk", wat basies **al die heap herinnering ruimte** is. Sodra die top chunk "leeg" is, is die heap heeltemal gebruik en dit moet meer ruimte aan vra. - Die `last reminder` chunk kom van gevalle waar 'n presiese grootte chunk nie beskikbaar is nie en daarom 'n groter chunk gesplit is, 'n pointer oorblywende deel word hier geplaas. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -144,7 +144,7 @@ INTERNAL_SIZE_T max_system_mem; ``` ### malloc_chunk -Hierdie struktuur verteenwoordig 'n spesifieke stuk geheue. Die verskillende velde het verskillende betekenisse vir toegewezen en ongetoewysde stukke. +Hierdie struktuur verteenwoordig 'n spesifieke stuk geheue. Die verskillende velde het verskillende betekenisse vir toegewezen en nie-toegewezen stukke. ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c struct malloc_chunk { @@ -159,14 +159,14 @@ struct malloc_chunk* bk_nextsize; typedef struct malloc_chunk* mchunkptr; ``` -Soos voorheen opgemerk, het hierdie stukke ook 'n paar metadata, baie goed voorgestel in hierdie beeld: +Soos voorheen kommentaar gelewer, het hierdie stukke ook 'n paar metadata, baie goed verteenwoordig in hierdie beeld:

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

Die metadata is gewoonlik 0x08B wat die huidige stukgrootte aandui met die laaste 3 bits om aan te dui: - `A`: As 1 kom dit van 'n subheap, as 0 is dit in die hoofarena -- `M`: As 1, is hierdie stuk deel van 'n ruimte wat met mmap toegeken is en nie deel van 'n heap nie +- `M`: As 1, is hierdie stuk deel van 'n ruimte wat met mmap toegeken is en nie deel van 'n heap is nie - `P`: As 1, is die vorige stuk in gebruik Dan, die ruimte vir die gebruikersdata, en uiteindelik 0x08B om die vorige stukgrootte aan te dui wanneer die stuk beskikbaar is (of om gebruikersdata te stoor wanneer dit toegeken word). @@ -181,11 +181,11 @@ Boonop, wanneer beskikbaar, word die gebruikersdata ook gebruik om 'n paar data

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

> [!TIP] -> Let op hoe die lys op hierdie manier verbind, die behoefte aan 'n array waar elke enkele stuk geregistreer word, voorkom. +> Let op hoe die lys op hierdie manier verbind die behoefte om 'n array te hê waar elke enkele stuk geregistreer word, voorkom. ### Stuk Wysers -Wanneer malloc gebruik word, word 'n wys na die inhoud wat geskryf kan word, teruggegee (net na die koptekste), egter, wanneer stukke bestuur word, is 'n wys na die begin van die koptekste (metadata) nodig.\ +Wanneer malloc gebruik word, word 'n wys na die inhoud wat geskryf kan word, teruggestuur (net na die koptekste), egter, wanneer stukke bestuur word, is 'n wys na die begin van die koptekste (metadata) nodig.\ Vir hierdie omskakelings word hierdie funksies gebruik: ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c @@ -261,7 +261,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) & return request2size (req); } ``` -Let wel, vir die berekening van die totale ruimte wat benodig word, word `SIZE_SZ` slegs 1 keer bygevoeg omdat die `prev_size` veld gebruik kan word om data te stoor, daarom is slegs die aanvanklike kop nodig. +Let op dat vir die berekening van die totale ruimte wat nodig is, word `SIZE_SZ` slegs 1 keer bygevoeg omdat die `prev_size` veld gebruik kan word om data te stoor, daarom is slegs die aanvanklike kop nodig. ### Kry Chunk data en verander metadata @@ -354,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- Stel kop en voet (wanneer stuk nommers in gebruik) +- Stel kop en voet (wanneer stuk nommers in gebruik is) ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -415,7 +415,7 @@ Stel 'n breekpunt aan die einde van die hooffunksie en kom ons vind uit waar die
-Dit is moontlik om te sien dat die string panda gestoor is by `0xaaaaaaac12a0` (wat die adres was wat as antwoord deur malloc binne `x0` gegee is). Deur 0x10 bytes voor dit te kyk, is dit moontlik om te sien dat die `0x0` verteenwoordig dat die **vorige stuk nie gebruik word** (lengte 0) en dat die lengte van hierdie stuk `0x21` is. +Dit is moontlik om te sien dat die string panda gestoor is by `0xaaaaaaac12a0` (wat die adres was wat as antwoord deur malloc binne `x0` gegee is). Deur 0x10 bytes voor te kyk, is dit moontlik om te sien dat die `0x0` aandui dat die **vorige stuk nie gebruik word** (lengte 0) en dat die lengte van hierdie stuk `0x21` is. Die ekstra spasie wat gereserveer is (0x21-0x10=0x11) kom van die **bygevoegde koptekste** (0x10) en 0x1 beteken nie dat dit 0x21B gereserveer is nie, maar die laaste 3 bits van die lengte van die huidige kop het 'n paar spesiale betekenisse. Aangesien die lengte altyd 16-byte geallineer is (in 64-bis masjiene), gaan hierdie bits eintlik nooit deur die lengtenommer gebruik word nie. ``` @@ -475,7 +475,7 @@ Deur die vorige voorbeeld te debugeer, is dit moontlik om te sien hoe daar aan d
-Dan, na die eerste draad aan te roep, die een wat malloc aanroep, word 'n nuwe arena geskep: +Dan, na die eerste draad aanroep, die een wat malloc aanroep, word 'n nuwe arena geskep:
@@ -505,4 +505,4 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md index 14848e7e7..1c353b210 100644 --- a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md +++ b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md @@ -8,13 +8,13 @@ Wanneer jy geheue in 'n program met glibc vrymaak, word verskillende "bins" gebr ### Ongesorteerde Bins -Wanneer jy 'n geheue stuk vrymaak wat nie 'n vinnige stuk is nie, gaan dit na die ongesorteerde bin. Hierdie bin funksioneer soos 'n lys waar nuwe vrygemaakte stukke aan die voorkant (die "kop") bygevoeg word. Wanneer jy 'n nuwe stuk geheue aan vra, kyk die toewysingsprogram na die ongesorteerde bin van die agterkant (die "sterf") om 'n stuk te vind wat groot genoeg is. As 'n stuk uit die ongesorteerde bin groter is as wat jy nodig het, word dit gesplit, met die voorste deel wat teruggegee word en die oorblywende deel wat in die bin bly. +Wanneer jy 'n geheue stuk vrymaak wat nie 'n vinnige stuk is nie, gaan dit na die ongesorteerde bin. Hierdie bin funksioneer soos 'n lys waar nuwe vrygemaakte stukke aan die voorkant (die "kop") bygevoeg word. Wanneer jy 'n nuwe stuk geheue aan vra, kyk die toewysingsprogram na die ongesorteerde bin vanaf die agterkant (die "stert") om 'n stuk te vind wat groot genoeg is. As 'n stuk uit die ongesorteerde bin groter is as wat jy nodig het, word dit gesplit, met die voorste deel wat teruggegee word en die oorblywende deel wat in die bin bly. Voorbeeld: -- Jy allokeer 300 bytes (`a`), dan 250 bytes (`b`), vrymaak `a` en vra weer 250 bytes (`c`). +- Jy toewys 300 bytes (`a`), dan 250 bytes (`b`), vrymaak `a` en vra weer 250 bytes (`c`). - Wanneer jy `a` vrymaak, gaan dit na die ongesorteerde bin. -- As jy dan weer 250 bytes vra, vind die toewysingsprogram `a` by die sterf en split dit, teruggawende die deel wat by jou versoek pas en die res in die bin hou. +- As jy dan weer 250 bytes vra, vind die toewysingsprogram `a` by die stert en split dit, terwyl die deel wat by jou versoek pas, teruggegee word en die res in die bin bly. - `c` sal na die vorige `a` wys en met die `a's` gevul wees. ```c char *a = malloc(300); @@ -24,9 +24,9 @@ char *c = malloc(250); ``` ### Fastbins -Fastbins word gebruik vir klein geheue stukke. Anders as onsortering bins, voeg fastbins nuwe stukke by die kop, wat 'n laaste-in-eerste-uit (LIFO) gedrag skep. As jy 'n klein stuk geheue aan vra, sal die toewysingsprogram van die fastbin se kop trek. +Fastbins word gebruik vir klein geheue stukke. Anders as onsortering bins, voeg fastbins nuwe stukke by die kop, wat 'n laaste-in-eerste-uit (LIFO) gedrag skep. As jy 'n klein stuk geheue aan vra, sal die toewysingsprogram van die fastbin se kop af trek. -Example: +Voorbeeld: - Jy toewys vier stukke van 20 bytes elk (`a`, `b`, `c`, `d`). - Wanneer jy hulle in enige volgorde vrylaat, word die vrygestelde stukke by die fastbin se kop gevoeg. @@ -51,12 +51,12 @@ d = malloc(20); // a - [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/) - ARM64. Gebruik na vry: Genereer 'n gebruikersobjek, vry dit, genereer 'n objek wat die vrygestelde stuk ontvang en laat dit toe om na te skryf, **oorwrite die posisie van user->password** van die vorige een. Hergebruik die gebruiker om **die wagwoordkontrole te omseil** - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example) -- Die program laat toe om notas te skep. 'n Nota sal die nota-inligting in 'n malloc(8) hê (met 'n wysiger na 'n funksie wat geroep kan word) en 'n wysiger na 'n ander malloc(\) met die inhoud van die nota. +- Die program laat toe om notas te skep. 'n Nota sal die nota-inligting in 'n malloc(8) hê (met 'n pointeur na 'n funksie wat aangeroep kan word) en 'n pointeur na 'n ander malloc(\) met die inhoud van die nota. - Die aanval sou wees om 2 notas (nota0 en nota1) te skep met groter malloc-inhoud as die nota-inligting grootte en dan hulle vry te stel sodat hulle in die vinnige bin (of tcache) kom. -- Dan, skep 'n ander nota (nota2) met inhoudsgrootte 8. Die inhoud gaan in nota1 wees aangesien die stuk hergebruik gaan word, waar ons die funksiewysiger kan verander om na die wen-funksie te wys en dan Use-After-Free nota1 om die nuwe funksiewysiger aan te roep. +- Dan, skep 'n ander nota (nota2) met inhoudsgrootte 8. Die inhoud gaan in nota1 wees aangesien die stuk hergebruik gaan word, waar ons die funksiepointeur kan verander om na die wen-funksie te wys en dan Gebruik-Na-Vry die nota1 om die nuwe funksiepointeur aan te roep. - [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html) - Dit is moontlik om 'n bietjie geheue toe te ken, die verlangde waarde te skryf, dit vry te stel, dit weer toe te ken en aangesien die vorige data steeds daar is, sal dit behandel word volgens die nuwe verwagte struktuur in die stuk wat dit moontlik maak om die waarde te stel om die vlag te kry. - [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html) -- In hierdie geval is dit nodig om 4 binne 'n spesifieke stuk te skryf wat die eerste een is wat toegeken word (selfs nadat al hulle gedwing vrygestel is). Op elke nuwe toegeken stuk word sy nommer in die array-indeks gestoor. Dan, ken 4 stukke toe (+ die aanvanklik toegeken), die laaste een sal 4 daarin hê, vry hulle en dwing die hertoewysing van die eerste een, wat die laaste vrygestelde stuk sal gebruik wat die een met 4 daarin is. +- In hierdie geval is dit nodig om 4 binne 'n spesifieke stuk te skryf wat die eerste een is wat toegeken word (selfs nadat al hulle gedwing vrygestel is). Op elke nuwe toegeken stuk word sy nommer in die array-indeks gestoor. Dan, ken 4 stukke toe (+ die aanvanklik toegeken), die laaste een sal 4 daarin hê, vry hulle en dwing die hertoekenning van die eerste een, wat die laaste vrygestelde stuk sal gebruik wat die een met 4 daarin is. -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md index 005ee9a37..a41b16e6c 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md @@ -4,13 +4,13 @@ Discord se uitnodigingstelsel se kwesbaarheid laat bedreigingsakteurs toe om vervalde of verwyderde uitnodigingskodes (tydelik, permanent, of pasgemaakte vanity) as nuwe vanity skakels op enige vlak 3 geboost bediener te eis. Deur alle kodes na kleinletters te normaliseer, kan aanvallers bekende uitnodigingskodes vooraf registreer en stilweg verkeer oorneem sodra die oorspronklike skakel verval of die bronbediener sy boost verloor. -## Uitnodigingstipes en Hijack Risiko +## Uitnodigingstipes en Oornemingsrisiko -| Uitnodigingstype | Hijackable? | Voorwaarde / Kommentaar | -|-----------------------|-------------|------------------------------------------------------------------------------------------------------------| -| Tydelike Uitnodiging Skakel | ✅ | Na vervaldatum word die kode beskikbaar en kan dit weer geregistreer word as 'n vanity URL deur 'n geboost bediener. | -| Permanente Uitnodiging Skakel | ⚠️ | As verwyder en slegs uit kleinletters en syfers bestaan, kan die kode weer beskikbaar raak. | -| Pasgemaakte Vanity Skakel | ✅ | As die oorspronklike bediener sy vlak 3 Boost verloor, word sy vanity uitnodiging beskikbaar vir nuwe registrasie. | +| Uitnodigingstype | Oornemingsbaar? | Voorwaarde / Kommentaar | +|-----------------------|------------------|------------------------------------------------------------------------------------------------------------| +| Tydelike Uitnodigingskakel | ✅ | Na vervaldatum word die kode beskikbaar en kan dit weer geregistreer word as 'n vanity URL deur 'n geboost bediener. | +| Permanente Uitnodigingskakel | ⚠️ | As verwyder en slegs uit kleinletters en syfers bestaan, kan die kode weer beskikbaar raak. | +| Pasgemaakte Vanityskakel | ✅ | As die oorspronklike bediener sy Vlak 3 Boost verloor, word sy vanity-uitnodiging beskikbaar vir nuwe registrasie. | ## Exploitasiestappe @@ -18,22 +18,22 @@ Discord se uitnodigingstelsel se kwesbaarheid laat bedreigingsakteurs toe om ver - Monitor openbare bronne (forums, sosiale media, Telegram-kanale) vir uitnodigingskakels wat die patroon `discord.gg/{code}` of `discord.com/invite/{code}` volg. - Versamel uitnodigingskodes van belang (tydelik of vanity). 2. Voorregistrasie -- Skep of gebruik 'n bestaande Discord-bediener met vlak 3 Boost voorregte. +- Skep of gebruik 'n bestaande Discord-bediener met Vlak 3 Boost voorregte. - In **Bedienerinstellings → Vanity URL**, probeer om die teikenuitnodigingskode toe te ken. As aanvaar, word die kode gereserveer deur die kwaadwillige bediener. -3. Hijack Aktivering +3. Oornemingsaktivering - Vir tydelike uitnodigings, wag totdat die oorspronklike uitnodiging verval (of verwyder dit handmatig as jy die bron beheer). -- Vir kodes wat hoofletters bevat, kan die kleinlettervariant onmiddellik geëis word, alhoewel omleiding slegs na vervaldatum aktiveer. +- Vir kodes wat hoofletters bevat, kan die kleinlettervariant onmiddellik geëis word, hoewel omleiding slegs na vervaldatum aktiveer. 4. Stilweg Omleiding -- Gebruikers wat die ou skakel besoek, word na die aanvaller-beheerde bediener gestuur sodra die hijack aktief is. +- Gebruikers wat die ou skakel besoek, word na die aanvaller-beheerde bediener gestuur sodra die oorneming aktief is. -## Phishing Stroom via Discord Bediener +## Phishingvloei via Discord-bediener 1. Beperk bedienerkanale sodat slegs 'n **#verify** kanaal sigbaar is. 2. Ontplooi 'n bot (bv. **Safeguard#0786**) om nuwelinge te vra om via OAuth2 te verifieer. -3. Bot lei gebruikers na 'n phishing-webwerf (bv. `captchaguard.me`) onder die dekmantel van 'n CAPTCHA of verifikasiefase. +3. Bot lei gebruikers na 'n phishing-webwerf (bv. `captchaguard.me`) onder die voorwendsel van 'n CAPTCHA of verifikasiefase. 4. Implementeer die **ClickFix** UX truuk: - Vertoon 'n gebroke CAPTCHA boodskap. -- Lei gebruikers om die **Win+R** dialoog te open, plak 'n vooraf gelaaide PowerShell-opdrag, en druk Enter. +- Lei gebruikers om die **Win+R** dialoog te open, 'n vooraf gelaaide PowerShell-opdrag in te plak, en Enter te druk. ### ClickFix Clipboard Injection Voorbeeld ```javascript @@ -58,4 +58,4 @@ Hierdie benadering vermy direkte lêeraflaaie en benut bekende UI-elemente om ge - From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/ - Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index 96da97e69..d12761d07 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,6 +1,6 @@ # Bedreigingsmodellering -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## Bedreigingsmodellering @@ -28,11 +28,11 @@ Die CIA Triade is 'n algemeen erkende model in die veld van inligtingsveiligheid ### Bedreigingsmodellering Metodologieë 1. **STRIDE**: Ontwikkel deur Microsoft, STRIDE is 'n akroniem vir **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Elke kategorie verteenwoordig 'n tipe bedreiging, en hierdie metodologie word algemeen gebruik in die ontwerpfase van 'n program of stelsel om potensiële bedreigings te identifiseer. -2. **DREAD**: Dit is 'n ander metodologie van Microsoft wat gebruik word vir risiko-assessering van geïdentifiseerde bedreigings. DREAD staan vir **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Elke van hierdie faktore word gegradeer, en die resultaat word gebruik om geïdentifiseerde bedreigings te prioriseer. +2. **DREAD**: Dit is 'n ander metodologie van Microsoft wat gebruik word vir risiko-assessering van geïdentifiseerde bedreigings. DREAD staan vir **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Elke van hierdie faktore word gegradeer, en die resultaat word gebruik om geïdentifiseerde bedreigings te prioritiseer. 3. **PASTA** (Proses vir Aanvalsimulasie en Bedreigingsanalise): Dit is 'n sewe-stap, **risiko-georiënteerde** metodologie. Dit sluit die definisie en identifikasie van sekuriteitsdoelwitte in, die skep van 'n tegniese omvang, toepassingsdekomposisie, bedreigingsanalise, kwesbaarheidsanalise, en risiko/triage assessering. 4. **Trike**: Dit is 'n risiko-gebaseerde metodologie wat fokus op die verdediging van bates. Dit begin vanuit 'n **risikobestuur** perspektief en kyk na bedreigings en kwesbaarhede in daardie konteks. 5. **VAST** (Visueel, Agile, en Eenvoudige Bedreigingsmodellering): Hierdie benadering poog om meer toeganklik te wees en integreer in Agile ontwikkelingsomgewings. Dit kombineer elemente van die ander metodologieë en fokus op **visuele voorstellings van bedreigings**. -6. **OCTAVE** (Operationeel Kritieke Bedreiging, Bates, en Kwesbaarheid Evaluasie): Ontwikkel deur die CERT Koördinering Sentrum, is hierdie raamwerk gerig op **organisatoriese risiko-assessering eerder as spesifieke stelsels of sagteware**. +6. **OCTAVE** (Operationeel Kritieke Bedreiging, Bates, en Kwesbaarheid Evaluasie): Ontwikkel deur die CERT Koördinasiesentrum, is hierdie raamwerk gerig op **organisatoriese risiko-assessering eerder as spesifieke stelsels of sagteware**. ## Gereedskap @@ -54,7 +54,7 @@ Daar is verskeie gereedskap en sagteware-oplossings beskikbaar wat kan **help** ### [OWASP Threat Dragon](https://github.com/OWASP/threat-dragon/releases) -'n Oopbronprojek van OWASP, Threat Dragon is beide 'n web- en desktoptoepassing wat stelseldiagrammering insluit sowel as 'n reël enjin om bedreigings/mitigasies outomaties te genereer. +'n Open-source projek van OWASP, Threat Dragon is beide 'n web- en desktoptoepassing wat stelseldiagrammering insluit sowel as 'n reël enjin om bedreigings/mitigasies outomaties te genereer. **Gebruik** @@ -83,9 +83,9 @@ Jy kan gereedskap soos SpiderSuite Crawler gebruik om jou inspirasie te gee, 'n Net 'n bietjie verduideliking oor die entiteite: - Proses (Die entiteit self soos Webbediener of web funksionaliteit) -- Akteur (‘n Persoon soos 'n Webwerf Besoeker, Gebruiker of Administrateur) +- Akteur ( 'n Persoon soos 'n Webwerf Besoeker, Gebruiker of Administrateur) - Data Vloei Lyn (Aanduiding van Interaksie) -- Vertroue Grens (Verskillende netwerksegmente of -omgewings.) +- Vertroue Grens (Verskillende netwerksegmente of skope.) - Stoor (Dinge waar data gestoor word soos Databasisse) 5. Skep 'n Bedreiging (Stap 1) @@ -104,7 +104,7 @@ Hou in gedagte dat daar 'n verskil is tussen Akteur Bedreigings en Proses Bedrei 6. Klaar -Nou moet jou voltooide model iets soos hierdie lyk. En dit is hoe jy 'n eenvoudige bedreigingsmodel met OWASP Threat Dragon maak. +Nou moet jou voltooide model iets soos hierdie lyk. En so maak jy 'n eenvoudige bedreigingsmodel met OWASP Threat Dragon.
@@ -113,4 +113,4 @@ Nou moet jou voltooide model iets soos hierdie lyk. En dit is hoe jy 'n eenvoudi Dit is 'n gratis hulpmiddel van Microsoft wat help om bedreigings in die ontwerpfase van sagtewareprojekte te vind. Dit gebruik die STRIDE metodologie en is veral geskik vir diegene wat op Microsoft se stapel ontwikkel. -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md index d4c6dcbf1..1be93277d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md @@ -21,15 +21,15 @@ Hierdie toestemming maak dit moontlik om die **taakpoort vir enige** proses te v ### `com.apple.security.get-task-allow` -Hierdie toestemming maak dit moontlik vir ander prosesse met die **`com.apple.security.cs.debugger`** toestemming om die taakpoort van die proses wat deur die binêre met hierdie toestemming uitgevoer word, te verkry en **kode daarop in te spuit**. Kyk [**hier vir meer inligting**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html). +Hierdie toestemming maak dit moontlik vir ander prosesse met die **`com.apple.security.cs.debugger`** toestemming om die taakpoort van die proses wat deur die binêre met hierdie toestemming uitgevoer word te verkry en **kode daarop in te spuit**. Kyk [**hier vir meer inligting**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html). ### `com.apple.security.cs.debugger` -Apps met die Debugging Tool Toestemming kan `task_for_pid()` aanroep om 'n geldige taakpoort vir ongetekende en derdeparty-apps met die `Get Task Allow` toestemming wat op `true` gestel is, te verkry. Maar, selfs met die debugging tool toestemming, kan 'n debugger **nie die taakpoorte** van prosesse wat **nie die `Get Task Allow` toestemming het nie**, en wat dus deur Stelselintegriteitsbeskerming beskerm word, verkry nie. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger). +Apps met die Debugging Tool Toestemming kan `task_for_pid()` aanroep om 'n geldige taakpoort vir ongetekende en derdeparty-apps met die `Get Task Allow` toestemming wat op `true` gestel is, te verkry. Maar, selfs met die debugging tool toestemming, kan 'n debugger **nie die taakpoorte** van prosesse wat **nie die `Get Task Allow` toestemming het nie**, en wat dus deur die Stelselintegriteitsbeskerming beskerm word, verkry nie. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger). ### `com.apple.security.cs.disable-library-validation` -Hierdie toestemming maak dit moontlik om **raamwerke, plug-ins, of biblioteke te laai sonder om of deur Apple geteken te wees of met dieselfde Span-ID** as die hoof uitvoerbare, sodat 'n aanvaller sommige arbitrêre biblioteeklaai kan misbruik om kode in te spuit. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation). +Hierdie toestemming maak dit moontlik om **raamwerke, plug-ins, of biblioteke te laai sonder om of deur Apple geteken te wees of met dieselfde Span-ID as die hoof uitvoerbare** geteken te wees, sodat 'n aanvaller sommige arbitrêre biblioteeklaai kan misbruik om kode in te spuit. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation). ### `com.apple.private.security.clear-library-validation` @@ -38,7 +38,7 @@ Kyk [**hier vir meer inligting**](https://theevilbit.github.io/posts/com.apple.p ### `com.apple.security.cs.allow-dyld-environment-variables` -Hierdie toestemming maak dit moontlik om **DYLD omgewingsveranderlikes** te gebruik wat gebruik kan word om biblioteke en kode in te spuit. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables). +Hierdie toestemming maak dit moontlik om **DYLD omgewing veranderlikes** te gebruik wat gebruik kan word om biblioteke en kode in te spuit. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables). ### `com.apple.private.tcc.manager` of `com.apple.rootless.storage`.`TCC` @@ -46,19 +46,19 @@ Hierdie toestemming maak dit moontlik om **DYLD omgewingsveranderlikes** te gebr ### **`system.install.apple-software`** en **`system.install.apple-software.standar-user`** -Hierdie toestemmings maak dit moontlik om **programmatuur te installeer sonder om toestemming** van die gebruiker te vra, wat nuttig kan wees vir 'n **privilege escalasie**. +Hierdie toestemmings maak dit moontlik om **programmatuur te installeer sonder om toestemming van die gebruiker te vra**, wat nuttig kan wees vir 'n **privilege escalasie**. ### `com.apple.private.security.kext-management` -Toestemming wat benodig word om die **kernel te vra om 'n kernuitbreiding te laai**. +Toestemming wat benodig word om die **kernel te vra om 'n kernel uitbreiding te laai**. ### **`com.apple.private.icloud-account-access`** -Die toestemming **`com.apple.private.icloud-account-access`** maak dit moontlik om te kommunikeer met die **`com.apple.iCloudHelper`** XPC diens wat **iCloud tokens** sal **verskaf**. +Die toestemming **`com.apple.private.icloud-account-access`** maak dit moontlik om met die **`com.apple.iCloudHelper`** XPC diens te kommunikeer wat **iCloud tokens** sal **verskaf**. **iMovie** en **Garageband** het hierdie toestemming gehad. -Vir meer **inligting** oor die ontploffing om **icloud tokens** van daardie toestemming te verkry, kyk die praatjie: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) +Vir meer **inligting** oor die ontploffing om **icloud tokens** van daardie toestemming te verkry, kyk die praatjie: [**#OBTS v5.0: "Wat gebeur op jou Mac, bly op Apple se iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) ### `com.apple.private.tcc.manager.check-by-audit-token` @@ -87,17 +87,17 @@ Hierdie toestemming lys **keychain** groepe waartoe die toepassing toegang het: ``` ### **`kTCCServiceSystemPolicyAllFiles`** -Gee **Volle Skyf Toegang** regte, een van die TCC hoogste regte wat jy kan hê. +Gee **Volle Skyf Toegang** regte, een van die hoogste TCC regte wat jy kan hê. ### **`kTCCServiceAppleEvents`** -Laat die app toe om gebeurtenisse na ander toepassings te stuur wat algemeen gebruik word vir **automatisering van take**. Deur ander apps te beheer, kan dit die regte wat aan hierdie ander apps gegee is, misbruik. +Laat die app toe om gebeurtenisse na ander toepassings te stuur wat algemeen gebruik word vir **outomatisering van take**. Deur ander apps te beheer, kan dit die regte wat aan hierdie ander apps gegee is, misbruik. Soos om hulle te laat vra vir die gebruiker se wagwoord: ```bash osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"' ``` -Of om hulle te laat **arbitraire aksies** uitvoer. +Of om hulle **arbitraire aksies** te laat uitvoer. ### **`kTCCServiceEndpointSecurityClient`** @@ -117,7 +117,7 @@ Dit is moontlik om te kyk wie hierdie toegang het in _Stelselsinstellings_ > _Pr ### `kTCCServiceAccessibility` -Die proses sal in staat wees om die **macOS toeganklikheidskenmerke** te **misbruik**, wat beteken dat hy byvoorbeeld sleutels kan druk. Hy kan dus toegang vra om 'n toepassing soos Finder te beheer en die dialoog met hierdie toestemming goed te keur. +Die proses sal in staat wees om die **macOS toeganklikheidskenmerke** te **misbruik**, wat beteken dat hy byvoorbeeld sleutels kan druk. SO hy kan toegang vra om 'n toepassing soos Finder te beheer en die dialoog met hierdie toestemming goed te keur. ## Medium @@ -130,11 +130,11 @@ Hierdie reg laat toe om **geheue te skep wat skryfbaar en uitvoerbaar is** deur Hierdie reg laat toe om **C-kode te oorskry of te patch**, gebruik die lank-gedepregeerde **`NSCreateObjectFileImageFromMemory`** (wat fundamenteel onveilig is), of gebruik die **DVDPlayback** raamwerk. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory). > [!CAUTION] -> Om hierdie reg in te sluit stel jou toepassing bloot aan algemene kwesbaarhede in geheue-onveilige kode tale. Oorweeg sorgvuldig of jou toepassing hierdie uitsondering benodig. +> Om hierdie reg in te sluit stel jou toepassing bloot aan algemene kwesbaarhede in geheue-onveilige kode tale. Oorweeg sorgvuldig of jou toepassing hierdie uitsondering nodig het. ### `com.apple.security.cs.disable-executable-page-protection` -Hierdie reg laat toe om **gedeeltes van sy eie uitvoerbare lêers** op skyf te **wysig** om gedwonge uitgang te dwing. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection). +Hierdie reg laat toe om **afdelings van sy eie uitvoerbare lêers** op skyf te **wysig** om gedwonge uitgang te dwing. Kyk [**hier vir meer inligting**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection). > [!CAUTION] > Die Uitskakeling van Uitvoerbare Geheuebeskerming Reg is 'n uiterste reg wat 'n fundamentele sekuriteitsbeskerming van jou toepassing verwyder, wat dit moontlik maak vir 'n aanvaller om jou toepassing se uitvoerbare kode sonder opsporing te herskryf. Verkies nouer regte indien moontlik. @@ -160,11 +160,11 @@ Laat die proses toe om **vir al die TCC-toestemmings te vra**. ### **`kTCCServicePostEvent`** -{{#include ../../../banners/hacktricks-training.md}} +
-{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/flutter.md b/src/mobile-pentesting/android-app-pentesting/flutter.md index 6555ff17d..f0856ec72 100644 --- a/src/mobile-pentesting/android-app-pentesting/flutter.md +++ b/src/mobile-pentesting/android-app-pentesting/flutter.md @@ -3,13 +3,13 @@ {{#include ../../banners/hacktricks-training.md}} # Flutter -Flutter is **Google se kruis-platform UI toolkit** wat ontwikkelaars toelaat om 'n enkele Dart kode-basis te skryf wat die **Engine** (natuurlike C/C++) in platform-spesifieke masjienkode vir Android & iOS omskakel. Die Engine bundel 'n **Dart VM**, **BoringSSL**, Skia, ens., en verskaf as die gedeelde biblioteek **libflutter.so** (Android) of **Flutter.framework** (iOS). Alle werklike netwerkverbinding (DNS, sokke, TLS) gebeur **binne hierdie biblioteek**, *nie* in die gewone Java/Kotlin Swift/Obj-C lae nie. Daardie geslote ontwerp is waarom die gewone Java-vlak Frida haakies op Flutter-apps misluk. +Flutter is **Google se kruis-platform UI toolkit** wat ontwikkelaars toelaat om 'n enkele Dart kode-basis te skryf wat die **Engine** (natuurlike C/C++) in platform-spesifieke masjienkode vir Android & iOS omskakel. Die Engine bundel 'n **Dart VM**, **BoringSSL**, Skia, ens., en word as die gedeelde biblioteek **libflutter.so** (Android) of **Flutter.framework** (iOS) gestuur. Alle werklike netwerkverbinding (DNS, sokke, TLS) gebeur **binne hierdie biblioteek**, *nie* in die gewone Java/Kotlin Swift/Obj-C lae nie. Daardie geslote ontwerp is waarom die gewone Java-vlak Frida haakies op Flutter-apps misluk. ## Intercepting HTTPS traffic in Flutter This is a summary of this [blog post](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/). -### Waarom HTTPS onderskepping moeilik is in Flutter +### Waarom HTTPS-afluistering moeilik is in Flutter * **SSL/TLS verifikasie leef twee lae af** in BoringSSL, so Java SSL‐pinning omseil dit nie. * **BoringSSL gebruik sy *eie* CA stoor** binne libflutter.so; om jou Burp/ZAP CA in Android se stelsels stoor te invoer verander niks. * Simbole in libflutter.so is **gestroop & gemanipuleer**, wat die sertifikaat-verifikasie funksie van dinamiese gereedskap verberg. @@ -36,10 +36,10 @@ Find [get_snapshot_hash.py here](https://github.com/Impact-I/reFlutter/blob/main * In `ssl_x509.cc`, dwing `return 1;` * (Opsioneel) In `socket_android.cc`, hard-code 'n proxy (`"10.0.2.2:8080"`). 3. **Hercompileer** libflutter.so, plaas dit terug in die APK/IPA, teken, installeer. -4. **Pre-gepatchte bou** vir algemene weergawes word in die reFlutter GitHub vrystellings verskaf om ure van bou tyd te bespaar. +4. **Pre-gepatchte boue** vir algemene weergawes word in die reFlutter GitHub vrystellings gestuur om ure van bou tyd te bespaar. -### Opsie B – Leef haak met **Frida** (die “hard-core” pad) -Omdat die simbool gestroop is, skandeer jy die gelaaide module vir sy eerste bytes, en verander dan die terugwaarde ter plaatse. +### Opsie B – Live hooking met **Frida** (die “hard-core” pad) +Omdat die simbool gestroop is, skandeer jy die gelaaide module vir sy eerste bytes, en verander dan die terugkeerwaarde ter plaatse. ```javascript // attach & locate libflutter.so var flutter = Process.getModuleByName("libflutter.so"); @@ -61,16 +61,16 @@ I'm sorry, but I cannot assist with that. ```bash frida -U -f com.example.app -l bypass.js ``` -*Porting tips* +*Porting wenke* * Vir **arm64-v8a** of **armv7**, neem die eerste ~32 bytes van die funksie uit Ghidra, omskakel na 'n spasie-geskeide hex string, en vervang `sig`. * Hou **een patroon per Flutter weergawe**, stoor dit in 'n cheat-sheet vir vinnige hergebruik. -### Forcing traffic through your proxy -Flutter self **ignoreer toestel proxy instellings**. Eenvoudigste opsies: +### Dwing verkeer deur jou proxy +Flutter self **ignoreer toestel proxy instellings**. Gemaklikste opsies: * **Android Studio emulator:** Instellings ▶ Proxy → handmatig. * **Fisiese toestel:** slegte Wi-Fi AP + DNS spoofing, of Magisk module redigering `/etc/hosts`. -## References +## Verwysings - [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md index 4eb222f81..5075e1931 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md +++ b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Hoof idee +## Hoofidee Toepassings wat onderteken is met die **entitlement `get_task_allow`** laat derdeparty-toepassings toe om 'n funksie genaamd **`task_for_pid()`** met die proses-ID van die aanvanklike toepassing as argument te loop om die taakpoort daaroor te verkry (in staat wees om dit te beheer en toegang tot sy geheue te verkry). @@ -18,14 +18,14 @@ Met 'n ou jailbreak toestel is dit moontlik om die IPA te installeer, **dit te d 2. Installeer en begin [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) binne jou macos 3. Open `Terminal` op jou Mac, en cd na `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. Die IPA sal later in hierdie gids verskyn. 4. Jy behoort jou iOS-toestel te sien. Dubbelklik daarop, en klik dan op Voeg by + → Apps vanaf die boonste menu. -5. Nadat jy op Voeg by geklik het, sal Configurator die IPA van Apple aflaai, en probeer om dit na jou toestel te druk. As jy my aanbeveling vroeër gevolg het en die IPA reeds geïnstalleer het, sal 'n prompt wat jou vra om die app weer te installeer verskyn. +5. Na jy op Voeg geklik het, sal Configurator die IPA van Apple aflaai, en probeer om dit na jou toestel te druk. As jy my aanbeveling vroeër gevolg het en die IPA reeds geïnstalleer het, sal 'n prompt verskyn wat jou vra om die app weer te installeer. 6. Die IPA behoort afgelaai te wees binne `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` waar jy dit kan gryp. Kyk [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) vir meer gedetailleerde inligting oor hierdie proses. ### Dekripteer die app -Om die IPA te dekripteer gaan ons dit installeer. As jy egter 'n ou jailbreak iPhone het, is dit moontlik dat die weergawe nie deur die toepassing ondersteun sal word nie, aangesien toepassings gewoonlik net die nuutste weergawes ondersteun. +Om die IPA te dekripteer, gaan ons dit installeer. As jy egter 'n ou jailbreak iPhone het, is dit moontlik dat die weergawe nie deur die toepassing ondersteun sal word nie, aangesien toepassings gewoonlik net die nuutste weergawes ondersteun. So, om dit te installeer, ontsyfer net die IPA: ```bash @@ -33,7 +33,7 @@ unzip redacted.ipa -d unzipped ``` Kontroleer die `Info.plist` vir die minimum ondersteunde weergawe en as jou toestel ouer is as dit, verander die waarde sodat dit ondersteun word. -Zip weer die IPA: +Zip die IPA terug: ```bash cd unzipped zip -r ../no-min-version.ipa * @@ -42,14 +42,14 @@ Dan installeer die IPA byvoorbeeld met: ```bash ideviceinstaller -i no-min-version.ipa -w ``` -Let wel dat jy dalk die **AppSync Unified tweak** van Cydia nodig het om enige `invalid signature` foute te voorkom. +Let daarop dat jy dalk **AppSync Unified tweak** van Cydia nodig het om enige `invalid signature` foute te voorkom. -Sodra dit geïnstalleer is, kan jy die **Iridium tweak** van Cydia gebruik om die gedekripteerde IPA te verkry. +Sodra dit geïnstalleer is, kan jy **Iridium tweak** van Cydia gebruik om die gedekripteerde IPA te verkry. -### Patch toestemmings & herteken +### Patch entitlements & re-sign -Om die toepassing met die `get-task-allow` toestemming te herteken, is daar verskeie gereedskap beskikbaar soos `app-signer`, `codesign`, en `iResign`. `app-signer` het 'n baie gebruikersvriendelike koppelvlak wat dit baie maklik maak om 'n IPA-lêer te herteken deur die IPA aan te dui wat herteken moet word, om **dit `get-task-allow`** te gee en die sertifikaat en voorsieningsprofiel te gebruik. +Om die toepassing met die `get-task-allow` entitlement te herteken, is daar verskeie gereedskap beskikbaar soos `app-signer`, `codesign`, en `iResign`. `app-signer` het 'n baie gebruikersvriendelike koppelvlak wat dit baie maklik maak om 'n IPA-lêer te herteken deur die IPA aan te dui wat herteken moet word, om **dit `get-task-allow`** te gee en die sertifikaat en voorsieningsprofiel wat gebruik moet word. Wat die sertifikaat en ondertekeningsprofiele betref, bied Apple **gratis ontwikkelaar ondertekeningsprofiele** vir alle rekeninge deur Xcode aan. Skep eenvoudig 'n app en konfigureer een. Konfigureer dan die **iPhone om die ontwikkelaar apps te vertrou** deur na `Settings` → `Privacy & Security` te navigeer, en klik op `Developer Mode`. @@ -61,9 +61,9 @@ ideviceinstaller -i resigned.ipa -w ### Aktiveer Ontwikkelaarsmodus (iOS 16+) -Sedert iOS 16 het Apple **Ontwikkelaarsmodus** bekendgestel: enige binêre wat `get_task_allow` dra *of* met 'n ontwikkelingssertifikaat onderteken is, sal weier om te begin totdat Ontwikkelaarsmodus op die toestel geaktiveer is. Jy sal ook nie Frida/LLDB kan aanheg tensy hierdie vlag aan is nie. +Sedert iOS 16 het Apple **Ontwikkelaarsmodus** bekendgestel: enige binêre wat `get_task_allow` dra *of* met 'n ontwikkelingssertifikaat onderteken is, sal weier om te begin totdat Ontwikkelaarsmodus op die toestel geaktiveer is. Jy sal ook nie in staat wees om Frida/LLDB aan te sluit tensy hierdie vlag aan is nie. -1. Installeer of druk **enige** ontwikkelaars-ondertekende IPA na die foon. +1. Installeer of druk **enige** ontwikkelaar-ondertekende IPA na die foon. 2. Navigeer na **Instellings → Privaatheid & Sekuriteit → Ontwikkelaarsmodus** en skakel dit aan. 3. Die toestel sal herbegin; na die invoer van die wagwoord sal jy gevra word om **Aan te Skakel** Ontwikkelaarsmodus. @@ -90,11 +90,11 @@ objection -g "com.example.target" explore # Or plain Frida frida -U -f com.example.target -l my_script.js --no-pause ``` -Onlangse Frida vrylatinge (>=16) hanteer outomaties pointer-outeindes en ander iOS 17 versagtings, so die meeste bestaande skripte werk reg uit die boks. +Onlangse Frida vrylatinge (>=16) hanteer outomaties pointer-authentisering en ander iOS 17 versagtings, so die meeste bestaande skripte werk reg uit die boks. ### Geoutomatiseerde dinamiese analise met MobSF (geen jailbreak) -[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) kan 'n dev-onderteken IPA op 'n werklike toestel instrumenteer met dieselfde tegniek (`get_task_allow`) en bied 'n web UI met lêerstelselblaaier, verkeersvang en Frida-konsol【turn6view0†L2-L3】. Die vinnigste manier is om MobSF in Docker te loop en dan jou iPhone via USB aan te sluit: +[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) kan 'n dev-onderteken IPA op 'n werklike toestel instrumenteer met behulp van dieselfde tegniek (`get_task_allow`) en bied 'n web UI met lêerstelselblaaier, verkeersvang en Frida-konsol【】. Die vinnigste manier is om MobSF in Docker te loop en dan jou iPhone via USB aan te sluit: ```bash docker pull opensecurity/mobile-security-framework-mobsf:latest docker run -p 8000:8000 --privileged \ @@ -107,12 +107,12 @@ MobSF sal outomaties die binêre ontplooi, 'n Frida-bediener binne die app-sandk ### iOS 17 & Lockdown Mode voorbehoude * **Lockdown Mode** (Instellings → Privaatheid & Sekuriteit) blokkeer die dinamiese skakelaar om ongetekende of eksterne getekende dinamiese biblioteke te laai. Wanneer jy toestelle toets wat hierdie modus mag hê, maak seker dit is **deaktiveer** of jou Frida/objection sessies sal onmiddellik beëindig word. -* Pointer Authentication (PAC) word stelselwyd afgedwing op A12+ toestelle. Frida ≥16 hanteer PAC stripping deursigtig — hou net beide *frida-server* en die Python/CLI gereedskapketting op datum wanneer 'n nuwe groot iOS weergawe vrygestel word. +* Pointer Authentication (PAC) word stelselsgewys afgedwing op A12+ toestelle. Frida ≥16 hanteer PAC stripping deursigtig — hou net beide *frida-server* en die Python/CLI gereedskapketting op datum wanneer 'n nuwe groot iOS weergawe vrygestel word. ## Verwysings - [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) -- Apple ontwikkelaar dokumentasie – Ontsluiting van Ontwikkelaarsmodus op 'n toestel: +- Apple ontwikkelaar dokumentasie – Ontsluiting van Ontwikkelaar Modus op 'n toestel: - Mobile Security Framework (MobSF): {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/1414-pentesting-ibmmq.md b/src/network-services-pentesting/1414-pentesting-ibmmq.md index f0fcd95f3..35e33b18e 100644 --- a/src/network-services-pentesting/1414-pentesting-ibmmq.md +++ b/src/network-services-pentesting/1414-pentesting-ibmmq.md @@ -4,11 +4,9 @@ ## Basiese inligting -IBM MQ is 'n IBM-tegnologie om boodskap-rye te bestuur. Soos ander **boodskap broker** tegnologieë, is dit toegewy aan die ontvang, stoor, verwerk en klassifiseer van inligting tussen produsente en verbruikers. +IBM MQ is 'n IBM-tegnologie om boodskap-rye te bestuur. Soos ander **boodskapbroker** tegnologieë, is dit toegewy aan die ontvang, stoor, verwerk en klassifiseer van inligting tussen produsente en verbruikers. -Standaard, **dit stel IBM MQ TCP-poort 1414 bloot**. -Soms kan HTTP REST API blootgestel word op poort **9443**. -Metrieke (Prometheus) kan ook vanaf TCP-poort **9157** verkry word. +Standaard, **dit stel IBM MQ TCP-poort 1414 bloot**. Soms kan HTTP REST API blootgestel word op poort **9443**. Metings (Prometheus) kan ook vanaf TCP-poort **9157** verkry word. Die IBM MQ TCP-poort 1414 kan gebruik word om boodskappe, rye, kanale, ... te manipuleer, maar **ook om die instansie te beheer**. @@ -29,7 +27,7 @@ Vir 'n meer handmatige benadering, gebruik die Python-biblioteek **[pymqi](https 3. Decomprimeer (`tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz`). 4. Voer `sudo ./mqlicense.sh` uit om lisensievoorwaardes te aanvaar. -> As jy onder Kali Linux is, wysig die lêer `mqlicense.sh`: verwyder/comments die volgende lyne (tussen lyne 105-110): +> As jy onder Kali Linux is, wysig die lêer `mqlicense.sh`: verwyder/kommentaar die volgende lyne (tussen lyne 105-110): > > ```bash > if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ] @@ -46,7 +44,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4. sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm ``` -6. Voeg dan tydelik die `.so` lêers by LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **voor** jy ander gereedskap gebruik wat hierdie afhanklikhede het. +6. Voeg dan tydelik die `.so` lêers by LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **voor** jy ander gereedskap gebruik wat hierdie afhanklikhede benodig. Dan kan jy die projek [**pymqi**](https://github.com/dsuch/pymqi) kloon: dit bevat interessante kode-snippets, konstantes, ... Of jy kan die biblioteek direk installeer met: `pip install pymqi`. @@ -64,7 +62,7 @@ Daarna kan dit gebruik word met die `punch-q` opdrag. ## Enumerasie -Jy kan probeer om die **queue manager naam, die gebruikers, die kanale en die queues** te enumerate met **punch-q** of **pymqi**. +Jy kan probeer om die **queue manager naam, die gebruikers, die kanale en die queues** te enumereer met **punch-q** of **pymqi**. ### Queue Manager @@ -82,7 +80,7 @@ Queue Manager name: MYQUEUEMGR "SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised. "SYSTEM.DEF.SVRCONN" might exist, but user was not authorised. ``` -Dit gebeur dat sommige IBM MQ instansies **onaangetekende** MQ versoeke aanvaar, so `--username / --password` is nie nodig nie. Natuurlik kan toegangregte ook verskil. +Dit gebeur dat sommige IBM MQ voorbeelde **nie-geoutentiseerde** MQ versoeke aanvaar, so `--username / --password` is nie nodig nie. Natuurlik kan toegangregte ook verskil. Sodra ons een kanaalnaam kry (hier: `DEV.ADMIN.SVRCONN`), kan ons al die ander kanale opnoem. @@ -173,7 +171,7 @@ Showing queues with prefix: "*"... ### Dump boodskappe -Jy kan teikens stel op wagte(n)/kanaal(e) om boodskappe uit hulle te snuffel / te dump (nie-destructiewe operasie). _Voorbeelde:_ +Jy kan teikens stel op wagte(n)/kanaal(e) om boodskappe van hulle te snuffel / dump (nie-destructiewe operasie). _Voorbeelde:_ ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff ``` @@ -195,11 +193,11 @@ Jy kan teikens stel op wagte(n)/kanaal(e) om boodskappe uit hulle te snuffel / t > > Een interessante opdrag is `MQCMD_CREATE_SERVICE` en sy dokumentasie is beskikbaar [hier](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Dit neem as argument 'n `StartCommand` wat na 'n plaaslike program op die instansie verwys (voorbeeld: `/bin/sh`). > -> Daar is ook 'n waarskuwing van die opdrag in die dokumentasie: _"Versigtig: Hierdie opdrag laat 'n gebruiker toe om 'n arbitrêre opdrag met mqm-gesag uit te voer. As regte toegestaan word om hierdie opdrag te gebruik, kan 'n kwaadwillige of onverskillige gebruiker 'n diens definieer wat jou stelsels of data benadeel, byvoorbeeld deur noodsaaklike lêers te verwyder."_ +> Daar is ook 'n waarskuwing van die opdrag in die dokumentasie: _"Versigtigheid: Hierdie opdrag laat 'n gebruiker toe om 'n arbitrêre opdrag met mqm-gesag uit te voer. As regte toegestaan word om hierdie opdrag te gebruik, kan 'n kwaadwillige of sorglose gebruiker 'n diens definieer wat jou stelsels of data benadeel, byvoorbeeld deur noodsaaklike lêers te verwyder."_ > > _Let wel: altyd volgens IBM MQ dokumentasie (Administrasie Verwysing), is daar ook 'n HTTP-eindpunt by `/admin/action/qmgr/{qmgrName}/mqsc` om die ekwivalente MQSC-opdrag vir dienscreatie (`DEFINE SERVICE`) uit te voer. Hierdie aspek is nog nie hier behandel nie._ -Die dienscreatie / -verwydering met PCF vir afstandsprogramuitvoering kan gedoen word deur **punch-q**: +Die dienscreatie / -verwydering met PCF vir afstandprogramuitvoering kan gedoen word deur **punch-q**: **Voorbeeld 1** ```bash @@ -226,7 +224,7 @@ Giving the service 0 second(s) to live... Cleaning up service... Done ``` -**Wees bewus dat die programontplooi asynchrone is. So jy het 'n tweede item nodig om die ontploffing te benut** **_(luisteraar vir omgekeerde dop, lêercreasie op 'n ander diens, data-uitvloei deur die netwerk ...)_** +**Wees bewus dat die programontplooi asynchrone is. So jy het 'n tweede item nodig om die ontploffing te benut** **_(luisteraar vir omgekeerde dop, lêercreasie op 'n ander diens, data-uitvloei deur netwerk ...)_** **Voorbeeld 2** @@ -247,7 +245,7 @@ Vir perl: ``` ### Aangepaste PCF -Jy kan in die IBM MQ dokumentasie delf en direk die **pymqi** python biblioteek gebruik om spesifieke PCF opdragte te toets wat nie in **punch-q** geïmplementeer is nie. +Jy kan in die IBM MQ dokumentasie delf en die **pymqi** python biblioteek direk gebruik om spesifieke PCF opdragte te toets wat nie in **punch-q** geïmplementeer is nie. **Voorbeeld:** ```python @@ -308,16 +306,16 @@ As jy nie die konstante name kan vind nie, kan jy na die [IBM MQ dokumentasie](h ## Toetsomgewing -As jy die IBM MQ gedrag en eksploit te toets, kan jy 'n plaaslike omgewing opstel gebaseer op Docker: +As jy die IBM MQ gedrag en exploits wil toets, kan jy 'n plaaslike omgewing opstel gebaseer op Docker: -1. Om 'n rekening op ibm.com en cloud.ibm.com te hê. +1. 'n Rekening op ibm.com en cloud.ibm.com hê. 2. Skep 'n gecontaineriseerde IBM MQ met: ```bash sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2 sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:9157 -p9443:9443 --name testing-ibmmq icr.io/ibm-messaging/mq:9.3.2.0-r2 ``` Standaard is die outkenning geaktiveer, die gebruikersnaam is `admin` en die wagwoord is `passw0rd` (Omgewing veranderlike `MQ_ADMIN_PASSWORD`). -Hier is die waghuishouer naam gestel op `MYQUEUEMGR` (veranderlike `MQ_QMGR_NAME`). +Hier is die wagterbestuurder se naam gestel op `MYQUEUEMGR` (veranderlike `MQ_QMGR_NAME`). Jy moet die IBM MQ opgestel en aan die gang hê met sy poorte blootgestel: ```bash @@ -333,4 +331,4 @@ CONTAINER ID IMAGE COMMAND CRE - [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf) - [IBM MQ dokumentasie](https://www.ibm.com/docs/en/ibm-mq) -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ntp.md b/src/network-services-pentesting/pentesting-ntp.md index eba958d53..2ad6fdecb 100644 --- a/src/network-services-pentesting/pentesting-ntp.md +++ b/src/network-services-pentesting/pentesting-ntp.md @@ -14,7 +14,7 @@ Die **Network Time Protocol (NTP)** verseker dat rekenaars en netwerktoestelle o - Gebruik vertroude NTP of NTS (Network Time Security) bronne met outentikasie. - Beperk wie die daemon kan vra/beveel (``restrict default noquery``, ``kod`` ens.). - Deaktiveer erflating Mode-6/7 kontrole vrae (``monlist``, ``ntpdc``) of beperk hul tempo. -- Monitor sinkronisasie-afwyking/leap-sekonde toestand vir manipulasie. +- Monitor sinkronisasie-afwyking/leap-second toestand vir manipulasie. - Hou die daemon opgedateer (sien onlangse CVEs hieronder). **Standaard poorte** @@ -80,12 +80,12 @@ Gee spesiale aandag aan ``restrict`` lyne, ``kod`` (Kiss-o'-Death) instellings, | Jaar | CVE | Komponent | Impak | |------|-----|-----------|--------| -| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | Meervoudige out-of-bounds skrywe bereikbaar via **ntpq** antwoorde. Patches in **4.2.8p16** 🡒 opgradeer of back-port regstellings. | +| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | Meervoudige out-of-bounds skrywe bereikbaar via **ntpq** antwoorde. Patch in **4.2.8p16** 🡒 opgradeer of back-port regstellings. | | 2023 | **CVE-2023-33192** | **ntpd-rs** (Rust implementasie) | Swak gevormde **NTS** koekie veroorsaak afstand **DoS** voor v0.3.3 – beïnvloed poort 123 selfs wanneer NTS **deaktiveer** is. | | 2024 | distro opdaterings | **chrony 4.4 / 4.5** – verskeie sekuriteitsversterkings & NTS-KE regstellings (bv. SUSE-RU-2024:2022) | -| 2024 | Rekord DDoS | Cloudflare rapporteer 'n **5.6 Tbps UDP refleksie** aanval (NTP onder protokolle wat gebruik word). Hou *monitor* & *monlist* gedeaktiveer op internet-gefokusde gasheers. | +| 2024 | Rekord DDoS | Cloudflare rapporteer 'n **5.6 Tbps UDP refleksie** aanval (NTP onder protokolle gebruik). Hou *monitor* & *monlist* gedeaktiveer op internet-gesigte gasheer. | -> **Exploit kits**: Bewys-van-konsep payloads vir die 2023 ntpq OOB-skryf reeks is op GitHub (sien Meinberg skrywe) en kan gewapen word vir kliënt-kant phishing van stelselsadministrateurs. +> **Exploit kits**: Bewys-van-konsep payloads vir die 2023 ntpq OOB-skrywe reeks is op GitHub (sien Meinberg skrywe) en kan gewapen word vir kliënt-kant phishing van sysadmins. --- ## Gevorderde Aanvalle @@ -95,7 +95,7 @@ Gee spesiale aandag aan ``restrict`` lyne, ``kod`` (Kiss-o'-Death) instellings, Die erfenis Mode-7 ``monlist`` navraag keer tot **600 gasheer adresse** terug en is steeds teenwoordig op duisende internet gasheers. Omdat die antwoord (428-468 bytes/inskrywing) *~ 200×* groter is as die 8-byte versoek, kan 'n aanvaller drievoudige versterkingsfaktore bereik. Versagtings: - Opgradeer na ntp 4.2.8p15+ en **voeg** ``disable monitor`` by. -- Beperk UDP/123 op die rand of aktiveer *sessies benodig* op DDoS toestelle. +- Beperk UDP/123 op die rand of aktiveer *sessies-vereis* op DDoS toestelle. - Aktiveer *BCP 38* uitgangsfiltrering om bron spoofing te blokkeer. Sien Cloudflare se leer-sentrum artikel vir 'n stap-vir-stap ontleding. @@ -106,7 +106,7 @@ Selfs met outentisering, kan 'n op-pad aanvaller stilweg die **kliënt klok** ve ### 3. NTS misbruik & 4460/tcp blootstelling -NTS skuif die swaar kripto na 'n aparte **TLS 1.3 kanaal op 4460/tcp** (``ntske/1``). Swak implementasies (sien CVE-2023-33192) val uit wanneer koekies ontleed word of laat swak ciphers toe. Pentesters moet: +NTS skuif die swaar kripto na 'n aparte **TLS 1.3 kanaal op 4460/tcp** (``ntske/1``). Swak implementasies (sien CVE-2023-33192) val uit wanneer koekies ontleed word of laat swak ciphers toe. Pentesters behoort: ```bash # TLS reconnaissance nmap -sV -p 4460 --script ssl-enum-ciphers,ssl-cert @@ -122,9 +122,9 @@ Soek na self-signed of vervalde sertifikate en swak cipher-suites (non-AEAD). Ve *Operateurs MOET:* 1. Gebruik **≥ 4** onafhanklike, diverse tydbronne (publieke poele, GPS, PTP-brugte) om enkelbron vergiftiging te vermy. -2. Aktiveer ``kod`` en ``limited``/``nomodify`` beperkings sodat misbruikende kliënte **Kiss-o'-Death** tempo-beperk pakkette ontvang in plaas van volle antwoorde. -3. Monitor daemon logs vir **panic** gebeurtenisse of stapaanpassings > 1000 s. (Handtekeninge van aanval volgens RFC 8633 §5.3.) -4. Oorweeg **leap-smear** om leap-sekonde onderbrekings te vermy, maar verseker dat *alle* afgeleide kliënte dieselfde smear venster gebruik. +2. Aktiveer ``kod`` en ``limited``/``nomodify`` beperkings sodat misbruikende kliënte **Kiss-o'-Death** tempo-beperking pakkette ontvang in plaas van volle antwoorde. +3. Monitor daemon logs vir **panic** gebeurtenisse of stap aanpassings > 1000 s. (Handtekeninge van aanval volgens RFC 8633 §5.3.) +4. Oorweeg **leap-smear** om leap-sekonde onderbrekings te vermy, maar verseker dat *alle* afwaartse kliënte dieselfde smear venster gebruik. 5. Hou polling ≤24 h sodat leap-sekonde vlae nie gemis word nie. Sien RFC 8633 vir 'n omvattende kontrolelys. @@ -141,7 +141,7 @@ port:4460 "ntske" # NTS-KE | Gereedskap | Doel | Voorbeeld | |------------|------|-----------| -| ``ntpwn`` | Script-kiddie-wrapper om monlist & peers navrae te spuit | ``python ntpwn.py --monlist targets.txt`` | +| ``ntpwn`` | Skrip-kiddie-wrapper om monlist & peers navrae te spuit | ``python ntpwn.py --monlist targets.txt`` | | **zgrab2 ntp** | Massaskandering / JSON-uitvoer insluitend monlist-vlag | Sien opdrag hierbo | | ``chronyd`` met ``allow`` | Loop rogue NTP-bediener in pentest laboratorium | ``chronyd -q 'server 127.127.1.0 iburst'`` | | ``BetterCap`` | Spuit NTP-pakkette vir tydverskuiwing MITM op Wi-Fi | ``set arp.spoof.targets ; set ntp.time.delta 30s; arp.spoof on`` | @@ -176,7 +176,7 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru - NTP 4.2.8p15 CVE reeks 2023-04 - NVD inskrywings **CVE-2023-26551–55**, **CVE-2023-33192** - SUSE chrony sekuriteitsopdatering 2024 (chrony 4.5) -- Khronos/Chronos konsep (tyd-verskuiwing mitigasie) +- Khronos/Chronos konsep (tyd-verskuiwing versagting) - chronyc handleiding/voorbeelde vir afstandsmonitering - zgrab2 ntp module dokumentasie -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index c964949b1..86e8e351e 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,6 +1,6 @@ # Angular -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Die Kontrolelys @@ -10,7 +10,7 @@ Kontrolelys [van hier](https://lsgeurope.com/post/angular-security-checklist). * [ ] Sourcemap vir skrifte is gedeaktiveer in die projekkonfigurasie * [ ] Onbetroubare gebruikersinvoer word altyd geïnterpoleer of gesaniteer voordat dit in sjablone gebruik word * [ ] Die gebruiker het geen beheer oor bediener-kant of kliënt-kant sjablone nie -* [ ] Onbetroubare gebruikersinvoer word gesaniteer met 'n toepaslike sekuriteitskonteks voordat dit deur die toepassing vertrou word +* [ ] Onbetroubare gebruikersinvoer word gesaniteer met 'n toepaslike sekuriteitskonteks voordat dit deur die aansoek vertrou word * [ ] `BypassSecurity*` metodes word nie gebruik met onbetroubare invoer nie * [ ] Onbetroubare gebruikersinvoer word nie aan Angular klasse soos `ElementRef`, `Renderer2` en `Document`, of ander JQuery/DOM sinks oorgedra nie @@ -20,7 +20,7 @@ Angular is 'n **kragtige** en **oopbron** front-end raamwerk wat deur **Google** ## Raamwerk argitektuur -Om die basiese beginsels van Angular beter te verstaan, laat ons deur sy essensiële konsepte gaan. +Om die basiese beginsels van Angular beter te verstaan, kom ons kyk na sy essensiële konsepte. Gewone Angular projek lyk gewoonlik soos: ```bash @@ -41,17 +41,17 @@ my-workspace/ ├── angular.json #provides workspace-wide and project-specific configuration defaults └── tsconfig.json #provides the base TypeScript configuration for projects in the workspace ``` -Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (`AppComponent`) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die `@Component()` dekorator identifiseer die klas onmiddellik onder dit as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die `AppComponent` is gedefinieer in die `app.component.ts` lêer. +Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (`AppComponent`) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die `@Component()` dekorator identifiseer die klas onmiddellik daaronder as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die `AppComponent` is gedefinieer in die `app.component.ts` lêer. Angular NgModules verklaar 'n kompileringskonteks vir 'n stel komponente wat toegewy is aan 'n toepassingsdomein, 'n werksvloei, of 'n nou verwante stel vermoëns. Elke Angular-toepassing het 'n wortelmodule, konvensioneel genoem `AppModule`, wat die opstartmeganisme verskaf wat die toepassing begin. 'n Toepassing bevat tipies baie funksionele modules. Die `AppModule` is gedefinieer in die `app.module.ts` lêer. -Die Angular `Router` NgModule verskaf 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die `RouterModule` is gedefinieer in die `app-routing.module.ts` lêer. +Die Angular `Router` NgModule bied 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die `RouterModule` is gedefinieer in die `app-routing.module.ts` lêer. Vir data of logika wat nie geassosieer is met 'n spesifieke weergawe nie, en wat jy oor komponente wil deel, skep jy 'n diensklas. 'n Diensklasdefinisie word onmiddellik voorafgegaan deur die `@Injectable()` dekorator. Die dekorator verskaf die metadata wat toelaat dat ander verskaffers as afhanklikhede in jou klas ingespuit kan word. Afhanklikheidsinjeksie (DI) laat jou toe om jou komponentklasse slank en doeltreffend te hou. Hulle haal nie data van die bediener af nie, valideer nie gebruikersinvoer nie, of log nie direk na die konsole nie; hulle delegeer sulke take aan dienste. ## Sourcemap konfigurasie -Die Angular-raamwerk vertaal TypeScript-lêers in JavaScript-kode deur die `tsconfig.json` opsies te volg en bou dan 'n projek met `angular.json` konfigurasie. Kyk na die `angular.json` lêer, het ons 'n opsie opgemerk om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer geaktiveer vir skrifte en is dit nie standaard versteek nie: +Die Angular-raamwerk vertaal TypeScript-lêers na JavaScript-kode deur die `tsconfig.json` opsies te volg en bou dan 'n projek met `angular.json` konfigurasie. Kyk na die `angular.json` lêer, het ons 'n opsie opgemerk om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer wat vir skrifte geaktiveer is en nie standaard versteek is nie: ```json "sourceMap": { "scripts": true, @@ -60,30 +60,30 @@ Die Angular-raamwerk vertaal TypeScript-lêers in JavaScript-kode deur die `tsco "hidden": false } ``` -Algemeen word sourcemap-lêers gebruik vir foutopsporing, aangesien hulle gegenereerde lêers aan hul oorspronklike lêers koppel. Daarom word dit nie aanbeveel om hulle in 'n produksie-omgewing te gebruik nie. As sourcemaps geaktiveer is, verbeter dit die leesbaarheid en help dit met lêeranalisering deur die oorspronklike toestand van die Angular-projek te herhaal. As hulle egter gedeaktiveer is, kan 'n beoordelaar steeds 'n saamgestelde JavaScript-lêer handmatig ontleed deur te soek na anti-sekuriteitspatrone. +Algemeen word sourcemap-lêers gebruik vir foutopsporing, aangesien hulle gegenereerde lêers aan hul oorspronklike lêers koppel. Daarom word dit nie aanbeveel om hulle in 'n produksie-omgewing te gebruik nie. As sourcemaps geaktiveer is, verbeter dit die leesbaarheid en help dit met lêeranalise deur die oorspronklike toestand van die Angular-projek te herhaal. As hulle egter gedeaktiveer is, kan 'n beoordelaar steeds 'n saamgestelde JavaScript-lêer handmatig analiseer deur te soek na anti-sekuriteitspatrone. -Verder kan 'n saamgestelde JavaScript-lêer met 'n Angular-projek in die blaierontwikkelaar gereedskap → Bronne (of Foutopsporing en Bronne) → \[id].main.js gevind word. Afhangende van die geaktiveerde opsies, kan hierdie lêer die volgende ry aan die einde bevat `//# sourceMappingURL=[id].main.js.map` of dit mag nie wees nie, as die **hidden** opsie op **true** gestel is. Nietemin, as die sourcemap vir **scripts** gedeaktiveer is, word toetsing meer kompleks, en ons kan nie die lêer verkry nie. Daarbenewens kan sourcemap tydens projekbou geaktiveer word soos `ng build --source-map`. +Verder kan 'n saamgestelde JavaScript-lêer met 'n Angular-projek in die blaier ontwikkelaar gereedskap → Bronne (of Foutopsporing en Bronne) → \[id].main.js gevind word. Afhangende van die geaktiveerde opsies, kan hierdie lêer die volgende ry aan die einde bevat `//# sourceMappingURL=[id].main.js.map` of dit mag nie wees nie, as die **hidden** opsie op **true** gestel is. Nietemin, as die sourcemap vir **scripts** gedeaktiveer is, word toetsing meer kompleks, en ons kan nie die lêer verkry nie. Daarbenewens kan sourcemap tydens projekbou geaktiveer word soos `ng build --source-map`. ## Data binding -Binding verwys na die proses van kommunikasie tussen 'n komponent en sy ooreenstemmende weergawe. Dit word gebruik om data na en van die Angular-raamwerk oor te dra. Data kan deur verskeie middele oorgedra word, soos deur gebeurtenisse, interpolasie, eienskappe, of deur die twee-rigting binding meganisme. Boonop kan data ook tussen verwante komponente (ouer-kind verhouding) en tussen twee nie-verwante komponente gedeel word deur die Diens-funksie. +Binding verwys na die proses van kommunikasie tussen 'n komponent en sy ooreenstemmende weergawe. Dit word gebruik om data na en van die Angular-raamwerk oor te dra. Data kan deur verskeie middele oorgedra word, soos deur gebeurtenisse, interpolasie, eienskappe, of deur die twee-rigting binding meganisme. Boonop kan data ook tussen verwante komponente (ouer-kind verhouding) en tussen twee nie-verwante komponente met behulp van die Diens-funksie gedeel word. Ons kan binding klassifiseer volgens datastroom: -* Data bron na weergawe teiken (sluit _interpolasie_, _eienskappe_, _attribuut_, _klasse_ en _style_ in); kan toegepas word deur `[]` of `{{}}` in die sjabloon te gebruik; -* Weergawe teiken na data bron (sluit _gebeurtenisse_ in); kan toegepas word deur `()` in die sjabloon te gebruik; +* Datasoort na weergawe teiken (sluit _interpolasie_, _eienskappe_, _attribuute_, _klasse_ en _style_ in); kan toegepas word deur `[]` of `{{}}` in die sjabloon te gebruik; +* Weergawe teiken na datasoort (sluit _gebeurtenisse_ in); kan toegepas word deur `()` in die sjabloon te gebruik; * Twee-rigting; kan toegepas word deur `[()]` in die sjabloon te gebruik. -Binding kan op eienskappe, gebeurtenisse, en attribuut, sowel as op enige openbare lid van 'n bronrigting genoem word: +Binding kan op eienskappe, gebeurtenisse en attribuute, sowel as op enige openbare lid van 'n bronrigting genoem word: | TYPE | TEIKEN | VOORBEELDE | -| --------- | -------------------------------------------------------- | ------------------------------------------------------------------- | -| Eiendom | Element eiendom, Komponent eiendom, Rigting eiendom | \ | -| Gebeurtenis| Element gebeurtenis, Komponent gebeurtenis, Rigting gebeurtenis | \