Gaffelbombe

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 31. august 2021; checks kræver 2 redigeringer .

En gaffelbombe  er et ondsindet eller fejlagtigt skrevet program, der uendeligt laver kopier af sig selv (ved hjælp af fork() systemkaldet ), som normalt også begynder at lave kopier af sig selv osv.

Udførelsen af ​​et sådant program kan forårsage en stor belastning på computersystemet eller endda et lammelsesangreb på grund af mangel på systemressourcer (proceshåndtag, hukommelse, processortid), som er målet.

Det klassiske gaffelbombeprogram (skrevet i C ) ser sådan ud:

#include <unistd.h> int main () { mens ( 1 ) gaffel (); }

Lignende tilfælde af systemressourcelæk er programmer, der afføder zombier og forældreløse processer . Men hvis de fleste gaffelbomber er skabt med vilje, er disse problemer normalt et resultat af skødesløshed eller inkompetence hos programmøren.

Beskrivelse

Gaffelbomben afføder et stort antal kopier af sig selv og forsøger derved at udfylde den ledige plads på listen over aktive processer i operativsystemet . Efter at have udfyldt listen over processer, bliver det umuligt at starte et nyttigt program. Selvom en anden proces afsluttes, og plads i proceslisten bliver ledig, er det usandsynligt, at et brugbart program starter, da mange andre kopier af gaffelbomben allerede venter på muligheden for at starte deres næste kopi.

Ud over at udfylde listen over processer, er strategier også mulige til at udfylde virtuel hukommelse, CPU-tid, sockets og andre systemressourcer. Resultatet af udmattelsen af ​​disse ressourcer er at bremse eller praktisk talt stoppe operativsystemet og/eller nyttige programmer ( computeren fryser ).

En gaffelbombe kan også opnås som følge af en fejl i samvittighedsfuld programmering. For eksempel kan et program, der lytter på en netværksport, ved modtagelse af en netværkspakke eller etablering af en forbindelse "falde" ind i en endeløs løkke med at skabe kopier af sig selv for at behandle pakken eller forbindelsen. En simpel programmeringsfejl kan føre til en hukommelseslækage eller konsekvenserne af en gaffelbombe.

Eksempler på gaffelbomber på forskellige programmeringssprog

C : [1]

#include <stdlib.h> int main ( ugyldig ) { for (;;) { system ( "start" ); } }

eller:

#include <unistd.h> int main ( ugyldig ) { while ( gaffel ()) {}; }

Bash : [2]

 : (){  : | : & } ; :

eller

gaffel () { gaffel | gaffel & } gaffel

Java :

public class forkbomb { public static void main ( String [] args ) { Runtime . getRuntime (). exec ( ny streng [] { "javaw" , "-cp" , System . getProperty ( "java.class.path" ), "forkbomb" }); } }

Perl :

gaffel mens gaffel

Python :

import os mens Sandt : os . gaffel ()

I nogle systemer er et sådant opkald forbudt, kopiering er kun mulig, hvis proces-id'et er gemt:

import os mens Sandt : a = os . gaffel ()

rubin :

gaffel mens gaffel

Anden mulighed:

sløjfe { gaffel }

PHP :

<?php while ( sand ) { pcntl_fork (); }

Microsoft Windows batchfil :

: s start %0 goto : s

Anden mulighed

start %0 %0

Variant på VB.NET

DoSystem . _ diagnostik . proces . Start ( System . Reflection . Assembly . GetExecutingAssembly ( ). Placering ) Loop Mens True

Pseudokode :

alg ProgramX mens true nc kalder ProgramX cc con alg ProgramX

Svært ved at eliminere

I tilfælde af en vellykket gaffelbombe bliver det svært eller næsten umuligt at genoprette den normale drift af computeren uden at genstarte , da den eneste måde at stoppe gaffelbomben i at virke på er at stoppe alle kørende kopier af gaffelbomben samtidigt. I de fleste operativsystemimplementeringer kræver det at kalde en kommando for at dræbe en proces at starte en ny proces, hvilket ikke er muligt under betingelserne for en succesfuldt kørende gaffelbombe.

Men i praksis kræver nogle gaffelbomber ikke så drastiske foranstaltninger og kan ødelægges uden behov for en genstart. Overvej for eksempel bombesagen fra eksemplet ovenfor:

 : (){  : | : & } ; :

Det særlige ved denne kode er, at den ikke går i løkker efter den mislykkede generering af dens kopier, men afsluttes. Som et resultat er listen over processer konstant på grænsen til at blive fyldt op: En af kopierne af gaffelbomben afsluttes, og den frigjorte plads optages straks af en nyoprettet proces fra en anden kopi af gaffelbomben. Det bliver muligt at konkurrere med gaffelbomben om plads i proceslisten. Så er det muligt før eller siden at køre en kommando for at dræbe alle kopier af gaffelbomben på samme tid, eller at køre et sikkert program, der gradvist vil "genvinde" en plads på listen over processer indtil den sidste proces af gaflen bomben ophører. Et eksempel på et sådant sikkert program i zsh :

mens ( sove 100 & ! ) gør ; Færdig

Forebyggelse

En måde at forhindre de negative virkninger af en gaffelbombe er kraftigt at begrænse antallet af processer, som en bruger kan køre på samme tid. Mængden af ​​allokeret virtuel hukommelse og andre systemressourcer kan også være begrænset. Når det maksimale antal tilgængelige processer er opbrugt, vil processens forsøg på at oprette en ny proces mislykkes. Det maksimale antal processer, der kan startes, bør være sådan, at det giver dig mulighed for at køre et rimeligt brugbart antal programmer, men ikke fører til et systemnedbrud, når en gaffelbombe affyres fra alle brugere af systemet på samme tid.

Det skal bemærkes, at begrænsning af antallet af processer i sig selv ikke forhindrer affyringen af ​​en gaffelbombe, men har kun til formål at minimere mulig skade, hvis den udløses.

En anden løsning på problemet er den intelligente genkendelse af gaffelbomben ved hjælp af selve operativsystemet, men denne løsning har ikke fundet bred anvendelse.

Der er også en sådan vanskelighed, at hvis en gaffelbombe tager al den tilgængelige processortid, så kan resultaterne af dens arbejde være katastrofale ikke kun på en enkelt processor, men også på et multiprocessorsystem, selv med en begrænsning på antallet af processer . For eksempel, hvis antallet af processorer er 16, og det maksimale antal kørende processer er 100, så vil der for hver processor være et gennemsnit på 6-7 kørende forekomster af gaffelbomben, som fortærer processortid. For at løse dette problem anvendes en processoraffinitetsgrænse.

Se også

Noter

  1. et af de mere elegante eksempler på en gaffelbombe, af Markys'om
  2. et af de mere elegante eksempler på en gaffelbombe, af Jaromil