Kingfisher: ο σαρωτής που πιάνει τα κλειδιά που νόμιζες πως έσβησες
Το Kingfisher είναι σαρωτής μυστικών από τη MongoDB, γραμμένος σε Rust, που ψάχνει κλειδιά και διαπιστευτήρια μέσα στα αρχεία ενός φακέλου και μέσα στο ιστορικό του Git. Στη δοκιμή μου βρήκε το ψεύτικο ιδιωτικό κλειδί RSA και το GitHub token που έφτιαξα και τα εμφάνισε σβησμένα, αλλά δεν σήμανε ένα χειροποίητο ζεύγος τύπου AWS.

Τι κάνει
Ένα κλειδί που μπαίνει σε αποθετήριο δεν βγαίνει εύκολα. Το σβήνεις από το αρχείο, κάνεις commit τη διαγραφή, και είναι ακόμη εκεί, σε κάθε προηγούμενο στιγμιότυπο. Δεν είναι σπάνιο ατύχημα: είναι ο συνηθισμένος τρόπος που διαρρέουν διαπιστευτήρια, τώρα μάλιστα που τα αντιγράφουν μηχανές και όχι άνθρωποι.
Ο Kingfisher ψάχνει ακριβώς αυτά. Του δίνεις φάκελο και τον σαρώνει· του δίνεις αποθετήριο και σαρώνει και το ιστορικό, όχι μόνο την τελευταία κατάσταση. Στον πυρήνα του έχει κανόνες: μοτίβα για τη μορφή ενός κλειδιού, με κριτήρια εμπιστοσύνης όπως η εντροπία, δηλαδή το πόσο τυχαίο φαίνεται ένα αλφαριθμητικό.
Στη δοκιμή μου φόρτωσε 488 κανόνες και έτρεξε με 8 παράλληλες εργασίες, χωρίς αρχείο ρύθμισης ή κατάλογο εξαιρέσεων. Το ευαίσθητο κείμενο βγαίνει σβησμένο, ως «[REDACTED PRIVATE KEY]» ή «ghp_16…8B4a»: δεν πετάει το κλειδί στην οθόνη ούτε στα αρχεία καταγραφής. Ένα εργαλείο που φωνάζει το μυστικό για να δείξει ότι το βρήκε, το έχει μόλις διαδώσει στο τερματικό σου.
Πίσω από το πρόγραμμα είναι η MongoDB, που το φιλοξενεί στο github.com/mongodb/kingfisher. Είναι γραμμένο σε Rust, με άδεια Apache-2.0, και σήμερα μετρά 1.272 αστέρια και 122 forks, με τελευταία ώθηση κώδικα στις 20 Οκτωβρίου 2026. Η τελευταία έκδοση είναι η v2.14.0, δημοσιευμένη την ίδια μέρα, και το αρχείο για Windows x64 έχει 22,0 MB με 342 λήψεις.
Τι δεν κάνει
Δεν ανακαλεί κλειδιά ούτε «καθαρίζει» το ιστορικό για σένα. Δοκιμάσαμε το εργαλείο: σου λέει τι βρήκε και προτείνει επόμενα βήματα, αλλά η πραγματική ανάκληση στον πάροχο και το rewrite του Git είναι δική σου δουλειά. Δεν είναι εργαλείο αποκατάστασης ή αυτοματοποιημένης απομάκρυνσης.
Δεν πιάνει ό,τι κι αν βάλεις μπροστά του. Το είδαμε: ένα χειροποίητο AWS αναγνωριστικό που άρχιζε AKIA δεν σημαδεύτηκε. Οι ανιχνεύσεις βασίζονται σε μοτίβα και κριτήρια όπως εντροπία, οπότε custom μορφές, μικρής εντροπίας tokens ή μυστικά κρυμμένα σε μη αναγνώσιμα blobs μπορούν να διαφύγουν. Η έξοδος είναι redacted· αν θέλεις να επαληθεύσεις το πλήρες μυστικό πρέπει να τρέξεις validate, το οποίο κάνει κλήσεις στο δίκτυο.
Δεν μπλοκάρει commits από μόνο του εκτός αν το εντάξεις ρητά σε pre‑commit hook ή CI. Εμείς δεν το είδαμε να ακυρώνει αυτόματα αλλαγές. Επίσης, οι συνδέσεις με απομακρυσμένες πηγές υπάρχουν, αλλά δεν είναι «plug‑and‑play» χωρίς ρύθμιση — μην περιμένεις ότι θα λύσει το πρόβλημα χωρίς ενσωμάτωση στη ροή εργασίας σου.
Για ποιον είναι
Για όποιον κάνει commit: τον προγραμματιστή που κρατά αρχείο με μεταβλητές περιβάλλοντος δίπλα στον κώδικα, τον διαχειριστή που κληρονόμησε αποθετήριο δέκα ετών, και προπάντων όποιον έχει βάλει βοηθό τεχνητής νοημοσύνης να γράφει και να κάνει commit αντί γι’ αυτόν. Ένας βοηθός που αντιγράφει παράδειγμα από τεκμηρίωση μπορεί να αντιγράψει μαζί και το κλειδί του παραδείγματος, όχι από κακία, αλλά επειδή έμοιαζε με το υπόλοιπο κείμενο.
Δεν έχει νόημα για όποιον δεν αγγίζει ποτέ διαπιστευτήρια. Και δεν αντικαθιστά το πρώτο βήμα μετά τη ζημιά: αν ένα κλειδί διέρρευσε σε δημόσιο αποθετήριο, το σωστό είναι να το ανακαλέσεις στον πάροχο. Η σάρωση είναι το δεύτερο βήμα.
Εγκατάσταση
Ένας δρόμος, καθαρός. Κατεβάζεις το αρχείο έκδοσης για Windows x64 από τη διεύθυνση github.com/mongodb/kingfisher/releases/download/v2.14.0/kingfisher-windows-x64.zip, το αποσυμπιέζεις όπου θέλεις, και μέσα βρίσκεις ένα μόνο εκτελέσιμο, το kingfisher.exe. Δεν υπάρχει εγκαταστάτης, δεν πειράζει το PATH, δεν θέλει επανεκκίνηση. Δοκίμασα και το προφανές, πακέτο στο winget: δεν υπάρχει.
Μετά, από τον φάκελο όπου ξεπακετάρισες, ο έλεγχος ότι το πρόγραμμα απαντά — με έναν φάκελο που δεν έχει τίποτα μέσα:
kingfisher scan .
Δεν ζήτησε κλειδί, λογαριασμό ή κάρτα γραφικών.
Χρήση σε κάθε LLM
Ο Kingfisher δεν είναι εργαλείο της μηχανής. Δεν δίνει στον βοηθό ικανότητα που δεν είχε. Είναι φρένο πριν από τη μηχανή. Ο Claude Code, το Codex CLI και ο Cursor γράφουν κώδικα και κάνουν commit μόνοι τους, όταν τους το επιτρέψεις. Ένας σαρωτής που τρέχει πριν από εκείνο το commit είναι ο μόνος που θα πιάσει το κλειδί που η μηχανή αντέγραψε κατά λάθος, τη στιγμή που πιάνεται χωρίς κόστος.
Γι’ αυτό δεν υπάρχει εδώ «ενσωμάτωση»: υπάρχει μία εντολή κελύφους και τρεις τρόποι να την κρεμάσεις στη ροή. Οι εντολές είναι πραγματικές και τις έτρεξα στο κέλυφος. Το πώς τις αξιοποιεί ο κάθε βοηθός είναι εκτίμησή μου, όχι μέτρηση μέσα σε συνεδρία πράκτορα.
Όταν βρίσκει κάτι, σου προτείνει δύο επόμενες εντολές: validate, που ρωτά τον πάροχο αν το κλειδί είναι ακόμη ζωντανό, και blast-radius, που από το όνομά του κρίνω ότι δείχνει πόσο μακριά φτάνει το κλειδί — αυτό δεν το έτρεξα. Το validate κάνει κίνηση στο δίκτυο, γι’ αυτό έβαλα επίτηδες --no-validate: δεν είχα διάθεση να χτυπήσω πραγματικούς παρόχους με ψεύτικα κλειδιά. Σε δημόσιο CI, --no-validate, πάντα.
Claude Code
Στο Claude Code βλέπω δύο σημεία όπου στέκει φυσικά. Το πρώτο είναι το άγκιστρο: το πρόγραμμα τρέχει εντολές σε συγκεκριμένες στιγμές της ροής του, και η στιγμή πριν υποβληθεί μια αλλαγή είναι η σωστή. Το άγκιστρο δεν είναι τίποτα παραπάνω από μια εντολή της οποίας ο κωδικός εξόδου αποφασίζει αν η ροή συνεχίζει. Πριν το εμπιστευτείς, τρέξε την με το χέρι και δες τι κωδικό εξόδου δίνει: δεν θα σου πω «μπλοκάρει το commit», επειδή δεν το έχω δει να το κάνει.
Από τη ρίζα του αποθετηρίου:
kingfisher scan . --no-validate
Ο δεύτερος δρόμος δεν θέλει στήσιμο: του ζητάς να την τρέξει ο ίδιος μέσα στην κουβέντα.
kingfisher scan ./src --no-validate
Codex CLI
Στο Codex CLI το κέλυφος είναι ο μοναδικός δρόμος, με τα όρια ασφαλείας του Codex να καθορίζουν τι επιτρέπεται να εκτελεστεί. Εκεί δεν θα το έβαζα ως άγκιστρο, αλλά στη ροή εργασίας από το τερματικό, στο σημείο όπου εσύ εγκρίνεις τι θα γίνει commit: ζητάς από το Codex να γράψει την αλλαγή, την αφήνεις ασήκωτη, και μετά τρέχεις τον σαρωτή μόνος σου.
Για έναν φάκελο:
kingfisher scan ./src --no-validate
Για αποθετήριο μαζί με το ιστορικό του, που είναι το πιο χρήσιμο πράγμα που κάνει:
kingfisher scan . --no-validate
Cursor
Στον Cursor το βλέπω ως εργασία πριν το commit. Ο πράκτορας έχει τερματικό και τρέχει τις ίδιες εντολές, και ο σαρωτής μπαίνει στο σημείο όπου σταματάς και κοιτάς τι έχει γίνει. Επειδή ο Cursor έχει δικό του σύστημα εργασιών, η εντολή μπορεί να οριστεί ως εργασία που τρέχει πριν από το commit. Δεν θα ισχυριστώ ότι έστησα αυτή την εργασία: την εντολή την έτρεξα στο κέλυφος, το στήσιμο μέσα στο πρόγραμμα είναι το επόμενο βήμα.
kingfisher scan . --no-validate
Πού κερδίζει, πού χάνει
Κερδίζει στο πιο σημαντικό: πιάνει κλειδιά που νόμιζες ότι έσβησες. Στη δοκιμή μου σάρωσε ένα αποθετήριο και βρήκε, μέσα σε 27 σβόλους — τα κομμάτια περιεχομένου που κρατά το Git — και στο ιστορικό, ένα token που είχε διαγραφεί από την τελευταία κατάσταση. Ένα εργαλείο που κοιτά μόνο τα τρέχοντα αρχεία δεν θα το έβλεπε ποτέ.
Κερδίζει επειδή δεν ζητά τίποτα: χωρίς εξαρτήσεις, τηλεμετρία ή συνδρομή. Και επειδή σβήνει το ευαίσθητο κείμενο, μπορείς να αφήσεις την έξοδό του στα αρχεία καταγραφής. Υποστηρίζει μάλιστα και απομακρυσμένες πηγές: GitHub, GitLab, Gitea, Bitbucket, Azure DevOps, Hugging Face, Slack, Microsoft Teams, Jira, Confluence, Postman, χώρους S3, Google Cloud Storage, Azure Blob, καθώς και εικόνες Docker. Αυτό το γράφω ως δυνατότητα του εργαλείου και τίποτα άλλο: δεν δοκίμασα ούτε μία από αυτές τις πηγές.
Πού χάνει, με σειρά σοβαρότητας.
Πρώτο, και το είδα με τα μάτια μου: δεν πιάνει ό,τι κι αν βάλεις μπροστά του. Έφτιαξα χειροποίητο ζεύγος διαπιστευτηρίων τύπου AWS, με αναγνωριστικό που ξεκινά από AKIA. Δεν το σήμανε. Δεν έχω εξήγηση και δεν θα σου δώσω ψεύτικη: ένα κλειδί με τη σωστή μορφή πέρασε κάτω από τη μύτη του σαρωτή. Όποιος στηρίζεται μόνο σε αυτό το εργαλείο, στηρίζεται σε δίχτυ με τρύπες που δεν ξέρει πού είναι.
Δεύτερο, οι 488 κανόνες δεν είναι απογραφή της πραγματικότητας. Είναι μοτίβα, και τα μοτίβα γερνούν. Ένα κλειδί με νέα μορφή που δεν έχει μπει ακόμη στους κανόνες περνάει. Δεν είναι αποτυχία του Kingfisher: ένας σαρωτής μυστικών είναι πάντα ένα βήμα πίσω από τους παρόχους.
Τρίτο, η σάρωση ιστορικού σε μεγάλο αποθετήριο θέλει προσοχή, γιατί το εργαλείο διαβάζει ό,τι έχει περάσει ποτέ και όχι ό,τι είναι τώρα εκεί. Δεν το μέτρησα σε μεγάλο project.
Δοκιμή
Ό,τι ακολουθεί το έτρεξα σήμερα, 24 Οκτωβρίου 2026, σε Windows 11, σε ένα Dell Inspiron 3576 με i5-8250U και 12 GB μνήμης, χωρίς κάρτα γραφικών, μέσα από το Git Bash.
Κατέβασα το zip των 22,0 MB, το αποσυμπίεσα, και μέσα υπήρχε ένα αρχείο, το kingfisher.exe.
Πρώτη δοκιμή. Έφτιαξα φάκελο με ένα ψεύτικο ιδιωτικό κλειδί RSA και δύο ψεύτικα token:
kingfisher scan ./test-secrets --no-validate
Φόρτωσε 488 κανόνες και έτρεξε με 8 παράλληλες εργασίες, χωρίς να του πω τίποτα από τα δύο. Βρήκε τα δύο από τα τρία. Το κλειδί το σήμανε με βεβαιότητα high και εντροπία 5,04, το GitHub token επίσης με βεβαιότητα high. Το τρίτο, το χειροποίητο ζεύγος τύπου AWS, δεν το σήμανε καθόλου. Στην έξοδο το ευαίσθητο κείμενο ήταν σβησμένο: το κλειδί ως «[REDACTED PRIVATE KEY]», το token ως «ghp_16…8B4a». Δεν χρειάστηκε να καθαρίσω τίποτα μετά.
Δεύτερη δοκιμή, και η σημαντική. Έφτιαξα αποθετήριο όπου ένα token υπήρχε σε παλαιότερο commit και είχε διαγραφεί από το τελευταίο στιγμιότυπο:
kingfisher scan ./repo-with-history --no-validate
Σάρωσε 27 σβόλους μαζί με το ιστορικό, και βρήκε το token που είχε διαγραφεί από την τελευταία κατάσταση.
Μέτρησα 70 χιλιοστά του δευτερολέπτου για δύο αρχεία, και δεν το παρουσιάζω ως επίδοση: δείγμα δύο αρχείων δεν λέει τίποτα.
Τι δεν δοκίμασα, στα ίσια: απομακρυσμένες πηγές, πλατφόρμες με token, επιδόσεις σε μεγάλο αποθετήριο, και καμία συνεδρία πράκτορα μέσα σε Claude Code, Codex CLI ή Cursor. Οι εντολές παραπάνω τρέχουν στο κέλυφος, και αυτό δοκιμάστηκε.
Τι κοστίζει
Χρήμα: μηδέν. Το εργαλείο είναι δωρεάν και ανοιχτού κώδικα, με άδεια Apache-2.0. Δεν υπάρχει συνδρομή, κλειδί ή χρέωση ανά σάρωση. Χώρος: 22,0 MB για το κατέβασμα, ένα εκτελέσιμο μετά την αποσυσκευασία.
Το πραγματικό κόστος είναι ο χρόνος, δύο λογιών. Ο πρώτος είναι να το βάλεις στη ροή σου και να το τηρήσεις εκεί: ένα φρένο που το χρησιμοποιείς μία φορά δεν είναι φρένο. Ο δεύτερος είναι η σάρωση ιστορικού σε μεγάλα αποθετήρια, που διαβάζει ό,τι έχει περάσει ποτέ. Σε αποθετήριο με χρόνια δουλειάς μιλάς για ώρα υπολογιστή, όχι για δευτερόλεπτα. Δεν το μέτρησα και δεν σου δίνω νούμερο.
Δημόσια νούμερα, με την πηγή τους. 1.272 αστέρια και 122 forks, τελευταία ώθηση στις 20 Οκτωβρίου 2026. Η έκδοση v2.14.0 δημοσιεύτηκε στις 20 Οκτωβρίου 2026 και το αρχείο Windows x64 έχει 342 λήψεις — νούμερο μικρό, και το λέω όπως είναι. Είναι εργαλείο που το κρατά μια εταιρεία, όχι ένα πλήθος χρηστών, τουλάχιστον προς το παρόν.
Ετυμηγορία
Ο Kingfisher κάνει ένα πράγμα που δεν το κάνει σχεδόν κανείς άλλος στη ροή μου: κοιτά το ιστορικό του Git, όχι μόνο τα τρέχοντα αρχεία. Στη δοκιμή μου βρήκε token που είχε διαγραφεί, μέσα σε 27 σβόλους. Είναι το είδος του λάθους που άνθρωπος δεν βρίσκει μόνος του και που μια μηχανή το παράγει με ευκολία.
Οι αντιρρήσεις μου είναι συγκεκριμένες. Δεν σήμανε το χειροποίητο ζεύγος τύπου AWS — γεγονός, όχι εντύπωση, και σημαίνει ότι δεν το εμπιστεύομαι ως μοναδικό δίχτυ. Τις απομακρυσμένες πηγές τις ξέρω μόνο από την τεκμηρίωση. Και η σάρωση ιστορικού σε μεγάλο αποθετήριο θέλει υπομονή που δεν έχω μετρήσει.
Η θέση του στη ροή μου είναι σαφής: ακριβώς πριν από το commit, ειδικά όταν το commit το κάνει βοηθός και όχι εγώ. Είναι φρένο πριν από τη μηχανή. Και τα φρένα τα τοποθετείς πριν από τη στροφή.
Score: 8,5/10.
Δείτε επίσης
Αν σου χρειάστηκε αυτό, δες και:
- Trivy: ένα αρχείο που σου λέει σε δευτερόλεπτα τι τρύπες έχει το έργο σου
- zizmor: η ασφάλεια των workflows ελέγχεται πριν τρέξει ο κώδικας
- Wassette: το sandbox που δεν πιστεύει ούτε την περιγραφή του εργαλείου
Πηγές: αποθετήριο https://github.com/mongodb/kingfisher · τεκμηρίωση https://mongodb.github.io/kingfisher/ · οδηγός εγκατάστασης https://mongodb.github.io/kingfisher/getting-started/installation/ · παρουσίαση του εργαλείου https://appsecsanta.com/kingfisher