![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| Tips og Tutorials Helpful articles fra vores brugere. |
Mere UNIX og Linux Forum Emner du måske kan finde Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Last Post |
| Learning Oracle ADF: A Beginner's Story | iBot | Oracle Opdateringer (RSS) | 0 | 04-06-2008 06:10 AM |
| CEP og historien om Fisk | iBot | Complex Event Processing RSS Nyheder | 0 | 12-17-2007 05:50 AM |
| Bangkok Post artikel: Historien bag Linux-operativsystemet | Neo | Nyheder, Links, arrangementer og Announcements | 0 | 04-05-2003 10:05 AM |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
|||||
|
Del 2 - Detaljer
Formatet for #! Line
Vi kan sige med sikkerhed, at de første 2 tegn skal være "#!". Eller kan vi? Mange systemer, synes det, er villige til at slette førende hvidt rum. Min anbefaling er at starte med #!. Det traditionelle. Næste der kan være en valgfri plads. Nogle dokumentation siger dette rum er nødvendig, men så vidt man kan fastslå den eneste Unix frigivelse til at kræve, at rummet var et øjebliksbillede frigivelse af BSD 4.1 ... dette var ikke en generel frigivelse). Faktisk ser det ud til, at du kan have flere rum, hvis du vil. Og nogle test med tabulatortegn er blevet gjort, og synes at virke. Min anbefaling er at udsætte med nul eller ét rum. Derefter kommer den fulde sti til tolk og ligesom alle fuld stier, det skal starte med en /. Ups, en anden undtagelse ... Linuxkernen (mindst version 2.0.34) er villig til at acceptere en relativ sti. Min anbefaling er ikke gør det. Vi kan ske. Eller vi kan have valgfri hvidt rum, der fører til vores enkelt argument. Bortset fra, at nogle versioner af FreeBSD håndtere flere argumenter. De fleste udgaver af BSD og HP-UX vil strimler efterfølgende hvidt rum. Andre versioner af Unix behandle efterfølgende blanke tegn som gyldige tegn. Og et par udgaver af BSD kan acceptere en efterfølgende kommentar afgrænset af en # karakter. Hvor længe kan den linje være? Et par versioner af Unix indstille grænse så lav som 32 tegn. FreeBSD kan tilsyneladende håndterer 8192 tegn. Mindst linjen altid slutter med Unix standard \ n karakter, right? Nå, ikke altid. Nogle versioner af Unix vil tolerere en \ r \ n slutter og bånd off the \ r mens andre ikke vil gøre det. Dette er ikke som standard, som det kunne være ... Argumentet 0 i processen, ikke Scriptet Der er en anden måde at implementeringer kan variere. Overvej perl script, at jeg løb ar slutningen af del 1. Min råtanken har tilnærmelsesvis svarer til execl ( ". / perlargs", ". / perlargs", "En", "to", "tre", (char *) NULL) og kernen omdannes det til den omtrentlige svarende til execl ( "/ usr / local / bin /perl", "/ usr / local / bin /perl", "-W", ". / Perlargs", "en", "to", "tre", (char *) NULL) Fremhævet med rødt er argumentet nul som i konventionen er det samme som stien på det program blive henrettet. Et bemærkelsesværdigt udførelse er, at login-programmet vil indstille den til ting som "-ksh". Oprindeligt eksekverbare shell scripts havde argumentet 0 indstillet til navnet på det script i stedet for navnet på den tolk. Disse dage, navnet på den tolk er fælles. Det sidste hold-out jeg kender, er HP-UX, som beskriver argument 0 til navnet på det script. |
|
|||||
|
Del 3 - SUID Shell Scripts
Når eksekverbare shell scripts blev første gang indført de hædret den suid bit. Det var en katastrofe for sikkerhed. Overvej et script opkald / usr / sbin / katastrofe. Og vi gjorde:
chown root / usr / sbin / katastrofe chmod 4755 / usr / sbin / katastrofe Naturligvis /, / usr, / usr / sbin kun skrives ved roden. Og selve besvarelsen er bare: #! / bin / sh Det er rigtigt. Scriptet er en enkelt linje uden skjulte tegn. Råtanken vil ignorere det, fordi det er en kommentar og derefter forlade, fordi der ikke er andre linjer. Dette script er allerede usikre og er sårbare over for to forskellige angreb. Angreb 1: link til-i Hvis vi gør: ln-s / usr / sbin / katastrofe. /-i og sørge for at udføre vores nye symbolsk link kaldet "-i". Hvis vi udføre de egentlige / usr / sbin / katastrofe, vi gør, hvad der svarer til: execl ( "/ bin / sh", "/ usr / sbin / katastrofe", "/ usr / sbin / katastrofe", (char *) NULL) Intet problem der. Det er, hvad vi havde forventet. Men når vi løber kopi særlige link kaldet "-i" vi gør: execl ( "/ bin / sh", "-i", "-i", (char *) NULL) Dette forårsager suid shell til at opføre sig som en interaktiv shell! Skallen blev hurtigt ændret til at acceptere en enkelt bindestreg som afslutningen på skifte indstilling argumenter. Så vi ændrer vores én linje script at læse: #! / bin / sh -- Nu samme trick ville medføre: execl ( "/ bin / sh", "-i", "-", "-i", (char *) NULL) Augument nul er stadig "-i", men det er harmløst. Det kan måske endda være nyttigt, fordi det gør dette angreb mere mærkbar med ps kommando. Attack 2: at ændre link Denne ene er sværere at forklare. Som før, gør vi et symbolsk link til scriptet under angreb, men denne gang navnet betyder ikke noget. Så vil vi køre scriptet via vores nye symbolske link. Så vi hurtigt ændre symbolsk link til at pege på et onde script. Vi ønsker at ændre, hvad den symbolske link peger på efter kerne åbner det, men før tolk åbner det. Dette er et kapløb betingelse og det vil ikke arbejde hver gang. Det kræver også en smule smart programmering for at trække denne en off. Men gjort korrekt, vil vi have vores onde script kører som root. Suid Scripts Deaktiveret Fordi det ikke var muligt at skrive en sikker suid shell script, begrebet suid shell scripts blev fjernet fra Unix. Omkring dette tidspunkt programmet sudo blev skrevet, og dette hovedsagelig oviated behovet for suid shell-scripts. Jeg tror ikke, at enhver version af unix udgivet i de sidste 15 år har disse problemer. (Og hvis jeg gjorde, ville jeg ikke har drøftet disse angreb. ) Nu håber jeg, du kan se, hvorfor mange gamle tid system admins (som mig) har stadig en mørk baggrund af suid shell-scripts.Tilbagelevering af Suid Scripts Solaris nu støtter suid shell-scripts, men det er immune over for disse angreb. Det sker ved at sikre, at scriptet er åbnet kun én gang i tilfælde af en suid script. Hvis suid bit er indstillet, Solaris bruger fd filsystem passere scriptet til tolk. Havde min perlargs script blevet suid på Solaris, ville det have været køre noget lignende: execl ( "/ usr / local / bin /perl"," / Usr / local / bin /perl","-W "," / dev/fd/3 "," en "," to "," tre ", (char *) NULL) og når perl åbnet / dev/fd/3, det bare bliver en anden åben fil descripter peger på den samme fil som uanset er åbnet som fd 3. Bemærk, at inde i script, der er ingen måde at få navnet bortset / dev/fd/3. Fordi navnet anvendes, er skjult for de intrepreter, der ikke er nogen skade, hvis dette navn var noget mærkeligt gerne "-i". Fordi script er åbnet én gang, er der ingen skade, hvis et symbolsk link pludselig skiftede til et onde script. Men bemærk, at dette i sidste ende får os til et stadium, hvor en en linje script, der kun indeholder en kommentar kan sikkert køre. Der kan stadig være andre sikkerhedsmæssige problemer med en dårligt skrevet suid script. Hvis du skal bruge suid shell-scripts, er der her et par tips: 1. Brug ksh Dave Korn analyseret alle de angreb på shell-scripts og lukkede så mange huller, som han kunne. Især ksh er immune over for IFS baseret angreb. Også hvis den konstaterer, at det vil interaktive med en effektiv uid af root sammen med en reel uid, der ikke er rod, det vil bruge sine root myndighed at fastsætte den effektive uid til den virkelige uid forud for udstedelse af en prompt. 2. Control PATH Udtrykkeligt angive din PATH variabel som det første skridt i dit script. Gør listen over mapper så kort som muligt. Du må ikke starte eller afslutte listen med et kolon eller har to på hinanden følgende koloner. Og ikke bringer. eller .. på listen. Udtrykkeligt eksport PATH. Og sikre, at hvert bibliotek nævnt i PATH er skrives kun ved roden. For eksempel, / usr / local / bin er på vej, så ud over det indlysende behov for / usr / local / bin er ikke-skrivbar, skal du også sørge for, at /, / usr, / usr / local er alle ikke skrives. Hvis / usr / local er monteret filsystem, skal det ikke være muligt for en ikke-root-bruger til at sørge for, / usr / local skal umonterede. Kan du yderligere beskytte dit script ved at påberåbe sig PATH så lidt som muligt. Så, for eksempel ved at bruge "/ usr / bin / rm", snarere end blot "rm". Bemærk: selv om jeg brugte / usr / local / bin som et eksempel, jeg vil modsætte sig at lægge / usr / local / bin i vejen for en suid script. Igen: gøre listen over mapper så kort som muligt. Jeg vil sjældent gå ud over "PATH \u003d / usr / bin" i en suid script. 3. Control IFS Indstil IFS til et rum, en fane og et newline. Og derefter eksportere IFS. Mens ksh er immune til IFS angreb, nogle andre tankene ikke er immune. Noget, du gør i din script indirekte kan påberåbe sig en anden skal. 4. Sørg for, at scriptet kan ikke skrive De fleste versioner af UNIX disse dage vil fjerne suid bit på en fil, som den er skrevet af en proces, der ejes af en bruger anderledes end ejeren af filen. Men ikke afhængige af, at adfærd. 5. Udfører ikke direkte eller indirekte enhver bruger leveret input Du skal sikre, at brugernes input er aldrig leveret til tanken at fortolke som eksekverbar kode. Hvis du ikke ved hvordan man kan sikre dette, bør du ikke bearbejde brugerinput. Bemærk, at parametrene for script skal betragtes brugerinput. 6. Vær forsigtig, hvis du påberåbe programmer at søge input fra brugeren Må ikke påberåbe programmer, der tillader brugeren at udføre vilkårlige programmer. For eksempel ikke bede brugeren om at VI en fil. VI tilbyder en måde for brugeren at udføre en subshell. Ja, ksh's built-in beskyttelse vil beskytte dig, hvis brugeren påberåber ksh interaktivt. Men desværre andre tanke eksisterer. Og brugeren behøver ikke en interaktiv skal med VI. En kommando gerne ":! Rm / etc / passwd" vil arbejde fra VI og det er ikke ved hjælp af en interaktiv skal. Disse skridt vil gå langt i retning af at sikre alle suid scripts du skriver, men jeg kan ikke garantere, at de er nok til at helt sikkert et script. |
|
|||||
|
Del 4: Odds og slutter
Opfundet af Dennis Ritchie Begrebet stammer med Dennis Ritchie: Code:
>From dmr Thu Jan 10 04:25:49 1980 remote from research The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID. 4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly. To take advantage of this wonderful opportunity, put #! /bin/sh at the left margin of the first line of your shell scripts. Blanks after ! are OK. Use a complete pathname (no search is done). At the moment the whole line is restricted to 16 characters but this limit will be raised. From uucp Thu Jan 10 01:37:49 1980 BSD hun har overtaget fra Version 8 i forskning Unix og gjort det populært. Hvad skal Call begrebet I sidste ende, #! linjen kom til at blive kaldt "sharpbang" linje og sharpbang kan stadig findes i nogle kerne-kildekode. Dette blev forkortet til "molevitten" eller anden måde. Jeg ville have forventet, "shabang" men det ser ud til, at "molevitten" er hvad de fleste mennesker bruger. Et par mennesker synes at bruge "hashpling". Tilsyneladende, SCO har et skifte kaldet "hashplingenable", som skal være indstillet på kerne bygge tid til at aktivere denne funktion. Og jeg har fået fortalt, at nogle folk bruger udtrykket "hashbang". (Alle, for sharppling?) Særlige regler for Perl Minde om, at flere argumenter om #! linje ofte bestået som et enkelt argument. Hvis perl er gået et argument som "-a-b". det vil bryde den fra hinanden og handle som "-a" og "-b" var blevet vedtaget. Også perl ikke ignorere #! linje. Perl vil nærlæse dem og vil tænde enhver switches, det finder. Dette hjælper kompensere for systemer med en meget kort #! linje grænse. perl vil scanne et #! linjen, indtil den finder string "perl". Derefter starter scanning for switches. Under denne scanning," -* "og" - "ignoreres. Hvis #! Linje ikke indeholder strengen"perl", perl vil behandle #! line den måde en Unix kerne ville og dermed påberåbe sig ordentlig tolk. Håndtering af forskellige stier Lad os sige nogle systemer har for eksempel / opt /perl/bin /perl og / usr / local / bin /perl. Hvordan man skriver en perl script? Min fornemmelse er, at det falder på systemadministratorrollen til at yde den nødvendige ensartethed. Jeg vil sætte perl i / usr / local / bin. Hvis perl installationsprocedure lægger perl i / opt /perl/bin /perl, Er det fint ... men så ville jeg et symbolsk link til / usr / local / bin peger på perl executable. Samme ting med perl. Så på alle systemer under min kontrol "#! / Usr / local / bin / python" er garanteret at arbejde eller python ikke er tilgængelig på det pågældende system. Samme ting med perlOsv. Det er sjældent for mig at tilføje et link til en mappe som / usr / bin. Men jeg vil for gøre dette for ksh og bash bør en OS mangler enten skallen. Og jeg altid sikre, at bash og ksh vil arbejde, hvis stuff gerne / opt eller / usr / local er umonterede. Disse tanke er de eneste tilfælde, hvor jeg vil tilsidesætte installation procedure, hvis jeg må. Så på min systemer ting som denne vil arbejde: #! / usr / bin / ksh #! / usr / bin / bash #! / usr / local / bin /perl Og indtil dette stuff værker, jeg mener ikke, at OS installation for at være komplet. Scripts importeret fra omverdenen kan have behov for en tweak at køre, hvis de forventer, at tolke andre steder. Men programmer som "konfigurere" finde perl hvis det er i / usr / local / bin. Så det er min tilgang. Men der er andre ideer ... En anden metode er at bruge et #! linje, der resulterer i et mellemliggende program påberåber den ønskede tolk efter en PATH søgning. De hyppigst anvendte eksempel ville være noget i retning af "#! / Usr / bin / env perl". Dette forudsætter, at env er i / usr / bin (ikke tilfældet med for eksempel Unicos, men min ovenstående bemærkninger gælder for env og jeg vil tilføje de nødvendige forbindelser). Det forudsætter også, at perl er på vej et sted. Et mere omfattende eksempel er Code:
#! /usr/bin/sh -- # -*- perl -*- -p
eval 'exec perl -S $0 ${1+"$@"}'
Og endnu mere omfattende eksempler er i bogen Programmering Perl af Larry Wall, et al. Og POSIX Standard på denne side kontrol med Citat:
Den ksh udvidet miljø Lad os sige, at du bruger ksh udelukkende og du har et script, og du forlader off the "#!". Din interaktive ksh vil forsøge at exec scriptet og mislykkes. Så din interaktive ksh med falde tilbage til at køre dit script som ksh script. Det sker ved at forking en kopi af sig selv at skabe en subshell. Denne kløvet subshell kan så i realiteten ekspandere på standard Unix begrebet "miljø". Når en proces exec's en anden proces, det nye program arver en masse ting, åbne filer, aktuelle bibliotek og miljø. Miljøet er et sæt strenge, som i konventionen, tager form af variable indstillinger, som f.eks: PATH \u003d / usr / bin: / usr / local / bin. Men kløvet ksh subshell ved alt om moderselskabet subshell. Tidlig ksh version udnyttes dette ved at have muligheder for at eksportere arrays, aliaser og funktioner. Dette kræver at undgå #! linje, og dermed lever med de problemer, dette skaber. De fleste steder stærkt opfordre til brug af #! linje, og dette undergraver ksh udvidet miljø koncept. Og det forveksles begyndere som så stuff gerne eksporteres aliaser nævnt i docs. Nyere versioner af ksh har tilbage fra den udvidede miljø koncept. Så mit forslag er at glemme alt om ksh eksporteres arrays, aliaser og funktioner og brug, at #! linje. |
| Bogmærker |
| Tags |
| perl, perl skift, molevitten, skift, skift perl |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|