arpl έγραψε:Και δυο κουβέντες για το ./ τι στο καλό τρέχει μ'αυτά τα σύμβολά;;; Απλά λέω στο bash shell ότι θέλω να τρέξει το αρχείο από τον τρέχοντα φάκελο που συντομευεται ως η τελεία(.) και μετά όπως και για οποιοδήποτε φάκελο αν θέλω να αναφερθώ στα αρχεία του βάζω ένα slash / και πλέον έχω το όνομα του προγράμματος που ζητάς από το shell να τρέξει. Αν δεν καταλάβατε τότε δοκιμάστε να τρέξετε ένα πρόγραμμα με το όνομά του και μετά με το πλήρες όνομά του. Για παράδειγμα η εντολή $ls έχει όνομα $/bin/ls. Άρα με την τελεία και το slash προσδιορίζω μονοσήμαντα σε πιο αρχείο αναφέρομαι ως προς τον τρέχων φάκελο.
Με άλλα λόγια το bash ξέρει ακριβώς που αναφέρομαι.
Δύο πράγματα παραπάνω για το command execution. Το ./ είναι security feature. Κάθε executable τρέχει απλά με το όνομα του (πχ δοκιμάστε /bin/ls -- τρέχει απλά γράφοντας το full path, χωρίς . χωρίς τπτ). Απο εκεί και πέρα όταν πληκτρολογούμε μια εντολή (όπως το ls) αυτή τρέχει κατευθείαν χωρίς να γράψουμε το πλήρες path. Για να γίνει αυτό το shell κοιτάει ένα environment variable που λέγεται PATH και στο οποίο έχουμε αποθηκεύσει μερικά directories (πχ opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin). Οπότε το shell παίρνει ένα, ένα όλα τα dirs απο εκει μέσα και δοκιμάζει να κάνει exec το command που δώσαμε (εάν δώσουμε δηλαδή ls, θα δοκιμάσει /opt/local/bin/ls, εάν αποτύχει θα δοκιμάσει /opt/local/sbin/ls κοκ). Τα πρώτα shells κοιτάγανε απο μόνα τους αρχικά το local directory. Oπότε εάν δίναμε ls θα κοίταγε να το βρεί πρώτα locally και εάν δεν το έβρισκε τότε θα έκανε όλο το παραπάνω. Αυτό ήταν και το πρόβλημα γιατί πολύ απλά κάποιος (συνήθως απλός user) μπορούσε να κάνει το εξής: πήγαινε σε κάποιο dir που είχε write permissions (πχ /home/user/dir1) και έβαζε μέσα ένα executable δικό του που το ονόμαζε ls, cat, κλπ. Στην συνέχεια έστελνε ένα email στον administrator και του έλεγε ότι μάλλον υπάρχει κάποιο πρόβλημα με ένα file/dir μέσα στο dir1. O admin (μάλλον σαν root) τι θα έκανε; θα πήγαινε εκεί να δει το file, τι perms έχει, να το κάνει cat κλπ κλπ. Ε μόλις έμπαινε μέσα στο /home/user/dir1 και έγραφε ls θα εκτελούσε το ls που έβαλε ο user μέσα εκεί και όχι το command ls*. Αυτό το trapped command συνήθως εκτελούσε malcode (πχ install a backdoor, add a dummy user as root, etc) και στην συνέχεια καλούσε το /bin/ls για να μην καταλάβει ο admin τπτ.
Οπότε για να αποφεύγεται αυτό τα shells πλέον δεν ψάχνουν πρώτα στο local dir αλλά πάντα στο path. Για να εκτελέσεις κάτι χωρίς να δίνεις το full path (να κάνεις override δηλαδή το security feature αυτό) πρέπει να γράψεις ./. Με αυτόν τον τρόπο είσαι aware ότι εκτελείς κάτι local και όχι κάποιο trap που σου έχει βάλει κάποιος κάπου.
*: Αν και στις μέρες μας είναι πλέον σπάνιο, οι παλιότεροι admins πάντα τρέχαν όλα τα commands με τα full paths τους (πχ /bin/ls, /sbin/ifconfig...). Στην ουσιά αυτό είναι κατάλοιπο απο πολύ παλιότερα όπου προσπαθούσαν να αποφεύγουν τέτοια attacks.