Ασφάλεια στο qub
Ημερομηνία ισχύος: 23 Σεπτεμβρίου 2026 Έκδοση: 1.1 — έλεγχος ακρίβειας υλοποίησης
Για ερευνητές — γρήγορη αναφορά:
- Πού να στείλετε αναφορές: support@qub.social με το πρόθεμα θέματος
[SECURITY].- Τι να συμπεριλάβετε: την ευπάθεια, βήματα αναπαραγωγής, και οποιοδήποτε proof-of-concept.
- Η απόκρισή μας: επιβεβαιώνουμε τη λήψη εντός 3 εργάσιμων ημερών και στοχεύουμε στην αποστολή διόρθωσης εντός 90 ημερών.
- Safe Harbor: δεν θα ασκήσουμε νομική δράση εναντίον έρευνας καλής πίστης που ακολουθεί τους κανόνες στο §12 (καμία πρόσβαση σε δεδομένα που δεν σας ανήκουν, καμία υποβάθμιση υπηρεσίας, καμία διατήρηση αποκτηθέντων δεδομένων πέρα από όσο χρειάζεται για να αποδείξετε το ζήτημα, δώστε μας εύλογο παράθυρο αποκάλυψης).
Πλήρεις λεπτομέρειες στο §12 (Συντονισμένη Αποκάλυψη).
Ποιοι είμαστε
Το qub.social λειτουργεί από την VSPRY AUSTRALIA PTY LIMITED (ABN 41 631 026 330), Level 38, 71 Eagle Street, Brisbane QLD 4000, Αυστραλία. Οι αναφορές σε «qub», «εμείς», «μας» και «μας» σημαίνουν αυτή την οντότητα.
Επικοινωνία ασφαλείας: support@qub.social με το πρόθεμα θέματος [SECURITY].
1. Η Προσέγγισή μας
Το qub είναι υποδομή εμπιστοσύνης. Το προϊόν είναι άχρηστο αν δεν είναι ασφαλές, οπότε η ασφάλεια δεν είναι χαρακτηριστικό — είναι το υπόβαθρο. Αυτή η σελίδα περιγράφει, σε συγκεκριμένους όρους, πώς προστατεύουμε τη στοίβα μας, τα δεδομένα σας, και την ακεραιότητα του σφραγισμένου περιεχομένου.
Η αξία μιας επαληθεύσιμης χρονικής δέσμευσης μεγαλώνει καθώς όλο και περισσότερο περιεχόμενο στο διαδίκτυο παράγεται από μηχανές. Μια επαληθευμένη συναλλαγή αποθήκευσης ή αγκύρωση αρχείου διαφάνειας μπορεί να τεκμηριώσει ότι το κρυπτοκείμενο υπήρχε το αργότερο κατά τον χρόνο του block της· το σφραγισμένο τεκμήριο αποδεικνύει χωριστά την ακεραιότητα του περιεχομένου, τη δέσμευση στον γύρο drand και τυχόν υπογραφές συγγραφής. Η διατήρηση αυτών των ισχυρισμών διακριτών είναι το πρότυπο αυτής της σελίδας.
Δεν σας ζητάμε να μας εμπιστευθείτε. Σχεδιάζουμε ώστε η εμπιστοσύνη που απαιτείται από εμάς να είναι όσο το δυνατόν μικρότερη, και όπου απαιτείται εμπιστοσύνη εξηγούμε ακριβώς τι εμπιστεύεται και γιατί.
Τρεις αρχές οδηγούν κάθε σχεδιαστική απόφαση:
- Ελαχιστοποιήστε αυτά που μπορεί να δει ο διακομιστής. Στην προεπιλεγμένη ροή μηνυμάτων του περιηγητή, το απλό κείμενο και το κλειδί περιτυλίγματος παραμένουν στη συσκευή σας. Η σφράγιση Builder από την πλευρά του διακομιστή, η συν-υπογραφή συμφώνων και η ρητά ενεργοποιημένη ανάκτηση έχουν διαφορετικά όρια εμπιστοσύνης, τα οποία εξηγούνται παρακάτω. Όπου διατηρούμε μεταδεδομένα, τα περιορίζουμε σε όσα χρειάζεται η επιλεγμένη λειτουργία.
- Κάντε τη συμβίβαση τοπικά περιορισμένη. Μια παραβίαση οποιουδήποτε στοιχείου (του διακομιστή μας, του παρόχου email, ενός κόμβου drand) δεν πρέπει να αποκαλύψει σφραγισμένο περιεχόμενο που δεν έχει ακόμη φτάσει στη στιγμή αποκάλυψής του.
- Κάντε το πρωτόκολλο ελέγξιμο. Το σφραγισμένο τεκμήριο είναι επαληθεύσιμο από άκρο σε άκρο με δημόσια κρυπτογραφία. Δεν χρειάζεται να εμπιστεύεστε το qub την υπηρεσία για να επαληθεύσετε ένα qub το τεκμήριο.
2. Μοντέλο Απειλής
2.1 Από Τι Προστατεύουμε
- Έναν επιτιθέμενο που αποκτά πρόσβαση ανάγνωσης στα αποθηκευμένα δεδομένα της πλευράς διακομιστή πριν τη στιγμή αποκάλυψης. Στην προεπιλεγμένη ιδιωτική ροή του περιηγητή αποκτά μεταδεδομένα και αδιαφανή περιτυλιγμένα bytes, όχι απλό κείμενο ή το K. Αυτή η προστασία δεν ισχύει για K που διατηρείται ρητά για ανάκτηση, για δημόσια/γυμνή παράδοση μετά τον γύρο drand της, ούτε για απλό κείμενο που παρέχεται παροδικά στις ροές Builder
/api/v1/sealκαι συμφώνων. - Έναν επιτιθέμενο που υποκλέπτει την κίνηση μεταξύ του προγράμματος περιήγησής σας και της υποδομής μας. Το TLS τερματίζει στο edge του CDN μας· τα σφραγισμένα payloads είναι ήδη κρυπτογραφημένα πριν τη μεταφορά.
- Έναν επιτιθέμενο που παραποιεί ένα αποθηκευμένο payload. Η πιστοποίηση του εξωτερικού περιτυλίγματος, όταν υπάρχει, η κανονική αποκωδικοποίηση, η σύνοψη σώματος, η εκ νέου παραγωγή του
qub_id, η δέσμευση στον γύρο και οι προαιρετικές υπογραφές κάνουν την παραποίηση να αποτυγχάνει στην επαλήθευση· ο θεατής αρνείται να εμφανίσει το qub. - Έναν επιτιθέμενο που προσπαθεί να συνδέσει ένα πλαστογραφημένο email συγγραφέα με κλειδί υπογραφής. Η πιστοποίηση email απαιτεί κατοχή τόσο του ιδιωτικού κλειδιού υπογραφής όσο και ενός εφάπαξ κωδικού που παραδίδεται στο εισερχόμενο email.
- Έναν συμβιβασμένο φορέα εκμετάλλευσης beacon drand. Το δίκτυο drand χρησιμοποιεί υπογραφές BLS κατωφλίου σε πολλαπλούς ανεξάρτητους φορείς εκμετάλλευσης· μια μειοψηφία δεν μπορεί να πλαστογραφήσει υπογραφές πρόωρης απελευθέρωσης.
2.2 Από Τι Δεν Μπορούμε να Προστατεύσουμε
Είμαστε ειλικρινείς σχετικά με τα όρια μας. Το qub δεν μπορεί να αμυνθεί κατά:
- Έναν συμβιβασμό της συσκευής σας πριν σφραγίσετε. Τοπικά keyloggers, κακόβουλες επεκτάσεις προγράμματος περιήγησης, ή φυσική πρόσβαση σε ξεκλείδωτη συσκευή μπορούν να συλλάβουν απλό κείμενο στο σημείο σύνθεσης.
- Μια κατάρρευση του κατωφλίου drand. Πολλαπλοί ανεξάρτητοι οργανισμοί εκτελούν το δίκτυο drand ειδικά για να το κάνουν αυτό δύσκολο, αλλά δεν είναι κρυπτογραφικά αδύνατο: αν αρκετοί φορείς εκμετάλλευσης συνεργαστούν, θα μπορούσαν να εξάγουν κλειδιά timelock νωρίς.
- Τις ιδιότητες απελευθέρωσης ενός έγκυρου αντιγράφου. Ένα δημόσιο/γυμνό qub γίνεται αποκρυπτογραφήσιμο μετά τον γύρο drand του. Ένα ιδιωτικό/περιτυλιγμένο qub απαιτεί επιπλέον το K· όποιος αποκτήσει τόσο τα αποθηκευμένα bytes όσο και το K μπορεί να το αποκρυπτογραφήσει μετά τον γύρο. Οι εγγραφές μόνιμης αποθήκευσης και αγκυρωμένου αρχείου δεν μπορούν να ανακληθούν απλώς με την αφαίρεσή τους από την επιφάνεια του προϊόντος qub.
- Έναν παγκόσμιο αντίπαλο που σπάει την υποκείμενη κρυπτογραφία (AES-GCM, παραδοχές ζεύγους BLS12-381, SHA3-256, ML-DSA-65). Αν αυτές οι πρωταρχικές πέσουν, το κρυπτογραφικό οικοσύστημα γενικότερα έχει μεγαλύτερα προβλήματα.
3. Κρυπτογραφία στην Πλευρά του Πελάτη
Στην προεπιλεγμένη ροή μηνυμάτων του περιηγητή, η κρυπτογράφηση περιεχομένου γίνεται πριν από το αίτημα μεταφόρτωσης. Δύο ρητές διαδρομές διαφέρουν: το Builder /api/v1/seal στέλνει σκόπιμα απλό κείμενο και K που δημιουργήθηκε από τον καλούντα στον Worker για σφράγιση στη μνήμη, ενώ η προετοιμασία και συν-υπογραφή συμφώνου στέλνει το υπογεγραμμένο δομημένο σύμφωνο στην υπηρεσία ώστε να ολοκληρώσει το διμερές τεκμήριο. Καμία από αυτές τις εξαιρέσεις δεν πρέπει να συγχέεται με κρυπτογράφηση από άκρο σε άκρο της διαδρομής του περιηγητή.
3.1 Timelock Encryption
Το qub χρησιμοποιεί tlock — κρυπτογράφηση βασισμένη σε ταυτότητα με κλειδί έναν μελλοντικό γύρο drand beacon. Η κρυπτογράφηση προχωρά στο πρόγραμμα περιήγησής σας χρησιμοποιώντας το δημόσιο κλειδί του δικτύου drand· το κλειδί αποκρυπτογράφησης απελευθερώνεται δημόσια από το δίκτυο drand μόνο όταν επιτευχθεί ο στοχευμένος γύρος. Κανείς, συμπεριλαμβανομένων μας, δεν μπορεί να ανακατασκευάσει το κλειδί αποκρυπτογράφησης εκ των προτέρων.
Στοχεύουμε στην αλυσίδα quicknet:
- Περίοδος γύρου 3 δευτερολέπτων
- Μη αλυσιδωτό λειτουργία (κάθε γύρος είναι ανεξάρτητος)
- Υπογραφές BLS12-381 G1
- Σύνοψη αλυσίδας
52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971
Το δημόσιο κλειδί και ο χρόνος γέννησης της αλυσίδας quicknet είναι μεταγλωττισμένα στον πελάτη. Δεν αντλούμε παραμέτρους αλυσίδας κατά τη διάρκεια εκτέλεσης, οπότε ένας κακόβουλος κόμβος δεν μπορεί να υποκαταστήσει αλυσίδα που ελέγχουμε εμείς.
3.2 Συμμετρική Κρυπτογράφηση
Το σχήμα tlock τυλίγει ένα κλειδί περιεχομένου AES-256-GCM. Το AES-GCM παρέχει πιστοποιημένη κρυπτογράφηση: ένα ενιαίο bit ανατροπή στο ciphertext προκαλεί αποτυχία της αποκρυπτογράφησης, αντί να παράγει σιωπηλά διαφθαρμένο απλό κείμενο.
3.3 Κανονική Σειριοποίηση
Οι δομές πρωτοκόλλου σειριοποιούνται με ντετερμινιστικό CBOR (RFC 8949 §4.2, core deterministic encoding). Δύο υλοποιήσεις που κωδικοποιούν την ίδια λογική δομή παράγουν πανομοιότυπο CBOR. Τα πλήρη σφραγισμένα payloads δεν είναι ντετερμινιστικά: η κρυπτογράφηση tlock και εξωτερικού περιτυλίγματος χρησιμοποιεί φρέσκια τυχαιότητα. Η σύνοψη σώματος υπολογίζεται πάνω στα ακατέργαστα bytes του σώματος, ενώ η κανονική κωδικοποίηση καθιστά σαφείς τις περιβάλλουσες υπογεγραμμένες δομές και δομές σύρματος.
Γράψαμε τον κωδικοποιητή CBOR χειρωνακτικά τόσο για τις υλοποιήσεις πελάτη όσο και διακομιστή μας αντί να βασιστούμε σε γενική βιβλιοθήκη σειριοποίησης — η απαίτηση είναι ακριβειακή, όχι εργονομική, και ιδιοτυπικά τεστ τρέχουν και στις δύο υλοποιήσεις για να επαληθεύσουν ότι συμφωνούν.
Ένα τεστ παλινδρόμησης διεκδικεί ότι η κανονική μορφή καλωδίου δεν περιέχει ακολουθία bytes της επωνυμίας qub πέρα από το πεδίο κλειδί qub_id της πρωταρχικής πρωτοκόλλου. Η μορφή καλωδίου είναι σκόπιμα ανεξάρτητη επωνυμίας — οποιοσδήποτε συμμορφούμενος θεατής (δικός μας ή τρίτου) μπορεί να εμφανίσει οποιοδήποτε qub από τη μόνιμη αποθήκευση, ανεξάρτητα από ποια ανάπτυξη το σφράγισε. Το τεστ είναι ένα tripwire που αποτρέπει μια μελλοντική αλλαγή από το να ψήσει κατά λάθος μια αναφορά επωνυμίας σε bytes που, μόλις είναι στη μόνιμη αποθήκευση, δεν μπορούν να ξαναγραφούν.
3.4 Σύνοψη Σώματος και Ακεραιότητα Προ-Αποκάλυψης
Κάθε σφραγισμένο payload φέρει μια σύνοψη SHA3-256 των ακατέργαστων bytes του σώματός του. Η σύνοψη δεσμεύεται στο qub_id και, όταν είναι ενεργοποιημένη η υπογραφή συγγραφής, στην είσοδο υπογραφής V2. Ο θεατής την υπολογίζει εκ νέου μετά την αποκρυπτογράφηση και απορρίπτει κάθε ασυμφωνία.
Το αναγνωριστικό περιεχομένου qub_id των 32 byte προκύπτει από μια προεικόνα 108 bytes που καλύπτει την έκδοση πρωτοκόλλου, τον τύπο περιεχομένου, τις χρονοσφραγίδες δημιουργίας και ξεκλειδώματος, την προαιρετική χρονοσφραγίδα έκβασης ή τον μηδενικό φρουρό της, τον στοχευμένο γύρο drand, τη σύνοψη σώματος και το SHA3-256 του προαιρετικού τίτλου κανονικοποιημένου κατά NFC. Μια πύλη ή ένα CDN δεν μπορεί να αλλάξει συνεκτικά κανένα δεσμευμένο πεδίο και να περάσει την εκ νέου παραγωγή. Οι τίτλοι περιορίζονται σε 100 σημεία κώδικα NFC και απορρίπτονται αν περιέχουν την κοινή κατηγορία εχθρικών ή ελεγκτικών σημείων κώδικα, όπως παρακάμψεις bidi, χαρακτήρες μηδενικού πλάτους, το tag block, BOM, C0, C1 και DEL.
3.5 Υπογραφή (ML-DSA-65)
Η υπογραφή συγγραφής χρησιμοποιεί ML-DSA-65 (FIPS 204), ένα σχήμα μετα-κβαντικής υπογραφής τυποποιημένο από το NIST. Διαλέξαμε σκόπιμα μια μετα-κβαντική πρωταρχική για υπογραφή επειδή το σφραγισμένο περιεχόμενο είναι μόνιμο: μια υπογραφή που επαληθεύεται σήμερα πρέπει να επαληθεύεται ακόμη και δεκαετίες από τώρα, συμπεριλαμβανομένου μετά τους κβαντικούς υπολογιστές μεγάλης κλίμακας γίνουν πρακτικοί.
Τα κλειδιά υπογραφής δημιουργούνται στον περιηγητή. Το τοπικό μυστικό περιτυλίγεται κάτω από ένα μη εξαγώγιμο κλειδί WebCrypto πριν αποθηκευτεί στο IndexedDB. Αν χρησιμοποιηθεί η δυνατότητα ανάκτησης μεταξύ συσκευών με εύρος λογαριασμού, ένα φορητό blob κλειδιού κρυπτογραφημένο με AEAD αποθηκεύεται στην πλευρά του διακομιστή· το κρυπτοκείμενο του μυστικού κλειδιού δεσμεύεται στο αμετάβλητο αναγνωριστικό λογαριασμού και η υπηρεσία επικυρώνει τον δημόσιο φάκελο, αλλά δεν μπορεί να αποκρυπτογραφήσει το μυστικό υλικό. Τα ακατέργαστα bytes του ιδιωτικού κλειδιού δεν αποστέλλονται στον διακομιστή. Τα δημόσια κλειδιά και τα αρχεία πιστοποίησης αποθηκεύονται για επαλήθευση και εμφάνιση ταυτότητας.
Η ίδια αποκρυπτογράφηση tlock μέσα στο πρόγραμμα περιήγησης εφαρμόζεται μέσα στο qub embed: όταν ένα σφραγισμένο qub εμφανίζεται μέσω <qub-embed> σε σελίδα τρίτου, η αποκρυπτογράφηση εξακολουθεί να συμβαίνει στο iframe embed στο πρόγραμμα περιήγησης του θεατή. Το embed δεν αλλάζει το μοντέλο εμπιστοσύνης — το απλό κείμενο δεν αποκρυπτογραφείται ποτέ σε διακομιστή qub.
3.6 Δημόσια Απόδοση — Προαιρετική
Τα σφραγισμένα qubs δεν φέρουν δείκτη on-chain προς τον δημιουργό τους εκτός εάν ο δημιουργός επιλέξει ρητά να συνδέσει έναν. Όταν σφραγίζετε ένα qub η εφαρμογή αναφοράς εκπέμπει μια ετικέτα αποθήκευσης Author (αποτύπωμα 64 χαρακτήρων hex του δημόσιου κλειδιού υπογραφής σας) μόνο όταν η «Δημόσια απόδοση» είναι ενεργοποιημένη στο βήμα επιλογής ημερομηνίας. Με τον διακόπτη απενεργοποιημένο — την προεπιλογή — καμία ετικέτα Author δεν γράφεται και το qub δεν αποδίδεται στη μόνιμη αποθήκευση: τίποτα στην αποθήκευση δεν συνδέει το ανέβασμα με το handle σας, το email σας, ή τα άλλα σας qubs. Με τον διακόπτη ενεργοποιημένο, το αποτύπωμα μεταφράζεται στο @handle σας μέσω της αλυσίδας πιστοποίησης στο §6.3 / §10 και η αντίστροφη μέτρηση του θεατή εμφανίζει «Σφραγίστηκε από @{handle}» πριν την αποκάλυψη.
Αυτό είναι σκόπιμη προστασία κατά του κινδύνου απαρίθμησης που θα δημιουργούσε μια always-on ετικέτα Author: ένας τρίτος που μαθαίνει το αποτύπωμα ενός δημιουργού θα μπορούσε διαφορετικά να αναζητήσει τη μόνιμη αποθήκευση από την ετικέτα και να ανακατασκευάσει την πλήρη ιστορική παραγωγή αυτού του δημιουργού. Η προαιρετική απόδοση κλείνει αυτό το κανάλι — μόνο qubs που ο δημιουργός επιλέγει ρητά να αποδώσει εμφανίζονται κάτω από αποτύπωμα στη μόνιμη αποθήκευση.
Η σελίδα προφίλ /u/{handle} είναι μια κάρτα επαληθευμένης ταυτότητας — handle, προαιρετικό εμφανιζόμενο όνομα + URL, σήμα «Επαληθευμένο email» (χωρίς διεύθυνση), και η σύντομη μορφή κρυπτογραφικού αποτυπώματος. Δεν απαριθμεί τα qubs ενός δημιουργού. Επισκέπτες που θέλουν να δουν συγκεκριμένο qub από έναν δημιουργό ακολουθούν την URL παράδοσης αυτού του qub απευθείας.
3.7 Εξωτερικός Κρυπτογραφικός Φάκελος
Ακόμη και αφού η αποκρυπτογράφηση timelock γίνει μαθηματικά δυνατή — μόλις δημοσιευτεί η υπογραφή drand για τον δεσμευμένο γύρο — το κανονικό στρώμα timelock μόνο του θα επέτρεπε σε έναν ευρετηριαστή να αποκρυπτογραφήσει μαζικά ανιχνεύσιμα qubs. Η ιδιωτική παράδοση κλείνει αυτό το κανάλι με ένα πρόσθετο συμμετρικό στρώμα γύρω από τα κρυπτογραφημένα με timelock bytes (Πρωτόκολλο §13). Η δημόσια παράδοση παραλείπει σκόπιμα το περιτύλιγμα ώστε οι σύνδεσμοι ειδοποίησης, ενσωμάτωσης και ανακάλυψης να λειτουργούν χωρίς μυστικό fragment.
Ο φάκελος χρησιμοποιεί AES-256-GCM, έναν πιστοποιημένο κρυπτογράφο τυποποιημένο από το NIST, με ένα φρέσκο 256-bit κλειδί K που δημιουργείται ανά qub από το CSPRNG του προγράμματος περιήγησής σας. Το K δεσμεύεται στο qub_id του qub ως πιστοποιημένα πρόσθετα δεδομένα, οπότε ένα κλειδί από ένα qub δεν μπορεί να επαναχρησιμοποιηθεί για να αποκρυπτογραφήσει διαφορετικό qub.
Το K δεν φτάνει ποτέ στους διακομιστές μας στην προεπιλεγμένη ιδιωτική ροή του περιηγητή. Κωδικοποιείται στο fragment URL του συνδέσμου κοινοποίησης (https://qub.social/c/<tx_id>#<base64url(K)>). Οι περιηγητές δεν μεταδίδουν fragments URL στους διακομιστές — το RFC 3986 τοποθετεί το fragment εκτός του αιτήματος — επομένως το qub.social, οι πύλες αποθήκευσης, τα CDN και η παρακολούθηση αιτημάτων δεν βλέπουν το K σε αυτή τη ροή. Το αποθηκευμένο OuterWrapper είναι αναγνωρίσιμο δομημένο CBOR, αλλά το πιστοποιημένο πεδίο κρυπτοκειμένου του κρύβει την εσωτερική δομή SealedQub και δεν μπορεί να ανοιχτεί χωρίς K.
Καθαρές συνέπειες:
- Το qub.social δεν μπορεί να αποκρυπτογραφήσει τις προεπιλεγμένες ιδιωτικές σφραγίσεις του περιηγητή μόνο από τα αποθηκευμένα δεδομένα. Μια παραβίαση του χώρου δεδομένων αποκτά αδιαφανές κρυπτοκείμενο χωρίς το K. Τα δημόσια qubs και τα qubs με ενεργοποιημένη ανάκτηση έχουν διαφορετική έκθεση εκ σχεδιασμού.
- Η απώλεια fragment είναι μη ανακτήσιμη χωρίς προαιρετικά ενεργοποιημένο κανάλι ανάκτησης. Αν αποθηκεύσετε ιδιωτικό σύνδεσμο χωρίς το fragment και δεν ενεργοποιήσατε ανάκτηση, το qub γίνεται μη αναγνώσιμο μέσω αυτού του συνδέσμου. Γι' αυτό η ροή σφράγισης εμφανίζει ρητή γνωστοποίηση «αποθηκεύστε αυτή την URL».
- Προαιρετική ανάκτηση. Όταν επιλέγετε ενεργοποίηση δημιουργικών emails κύκλου ζωής για ένα qub ΚΑΙ το email ταιριάζει με την επαληθευμένη σας ταυτότητα, αποδεχόμαστε το K με το ανέβασμα, αποθηκεύουμε την πλήρη URL παράδοσης στην εγγραφή σφραγισμένης ιστορίας της ταυτότητάς σας, και τη χρησιμοποιούμε ως τον σύνδεσμο στο email επιβεβαίωσης σφραγίδας. Αυτή η ανταλλαγή — ένα κανάλι ανάκτησης από την πλευρά διακομιστή με αντάλλαγμα κάποια καθαρότητα από άκρο σε άκρο — εμπλέκεται μόνο σε ρητή ενεργοποίηση και μόνο για αυτό το qub. Η προεπιλεγμένη στάση είναι crypto-shredding.
Το server-side τελικό σημείο /api/v1/seal του Worker (που χρησιμοποιείται από πράκτορες AI και άλλους καλούντες API) απαιτεί από τον καλούντα να δημιουργήσει το K με ένα CSPRNG, να το διατηρήσει τοπικά, και να το παρέχει ως wrapper_key_b64url. Ο Worker αναπόφευκτα βλέπει τόσο το απλό κείμενο όσο και το K στη μνήμη σε αυτή τη ρητά έμπιστη διαδρομή, αλλά δεν διατηρεί κανένα από τα δύο. Ένα υποχρεωτικό Idempotency-Key αποτρέπει μια χαμένη απόκριση από το να δημιουργήσει ένα δεύτερο χρεωμένο qub, ενώ το K που διατηρεί ο καλών μπορεί να συνδυαστεί με την επαναλαμβανόμενη URL χωρίς fragment. Αυτό διαφέρει από την προεπιλεγμένη διαδρομή προγράμματος περιήγησης, όπου το K δεν φτάνει ποτέ στον Worker εκτός αν ο δημιουργός ενεργοποιήσει ρητά την ανάκτηση.
4. Μεταφορά και Edge
4.1 TLS
Η κίνηση του περιηγητή προς το qub εξυπηρετείται μέσω HTTPS στο edge του Cloudflare. Οι αποκρίσεις ορίζουν HTTP Strict Transport Security (max-age=63072000; includeSubDomains; preload). Η ακριβής έκδοση TLS και η σουίτα κρυπτογράφησης που διαπραγματεύεται διέπονται από την ενεργή διαμόρφωση του edge και δεν δηλώνονται από τον κώδικα εφαρμογής. Δεν εκθέτουμε ξεχωριστά προσβάσιμο διακομιστή προέλευσης.
4.2 Ασφάλεια Περιεχομένου
Ο μεταγλωττισμένος πελάτης εξυπηρετείται με αυστηρές κεφαλίδες τύπου περιεχομένου και cache. Το κέλυφος SPA είναι μία προέλευση. Δεν ενσωματώνουμε scripts τρίτων για αναλυτικά ή διαφημίσεις. Τα δύο σημεία επαφής τρίτων στο προϊόν είναι αμφότερα στενά περιορισμένα: η ροή αγοράς αφήνει εντελώς το SPA με πλήρη ανακατεύθυνση σελίδας στο checkout που φιλοξενείται από το Stripe (https://checkout.stripe.com/…) — το UI του Stripe δεν εκτελείται ποτέ στην προέλευσή μας και δεν βλέπουμε ποτέ δεδομένα κάρτας — και η ροή σφράγισης φορτώνει το widget Turnstile του Cloudflare, μια εναλλακτική CAPTCHA που σέβεται το απόρρητο που το Cloudflare αποδίδει μέσα στο δικό του sandboxed iframe. Κανένα μέρος δεν μπορεί να διαβάσει το υπόλοιπο της σελίδας.
Το iframe ενσωμάτωσης qub (εξυπηρετείται από qub.social/embed/{tx_id} και φορτώνεται σε ιστότοπους τρίτων από το embed.js) φέρει τη δική του Content-Security-Policy. Η λίστα επιτρεπόμενων του connect-src είναι 'self', https://qub.social, https://arweave.net, https://ar-io.dev, https://permagate.io, https://api.drand.sh και https://drand.cloudflare.com. Το iframe εκτελείται με sandbox="allow-scripts allow-top-navigation-by-user-activation", όχι με allow-same-origin: η σελίδα υποδοχής δεν μπορεί να διαβάσει το DOM του και το iframe δεν μπορεί να πλοηγηθεί στην υποδοχή παρά μόνο μετά από ενέργεια του χρήστη.
4.3 CORS και Εύρος Fetch
Ο πελάτης προγράμματος περιήγησης κάνει αιτήματα fetch μόνο σε:
- Το δικό μας API (
api.qub.socialκαι staging ισοδύναμα) - Πύλες αποθήκευσης (μόνο για ανάγνωση, για ανάκτηση περιτυλιγμένων ιδιωτικών ή γυμνών δημόσιων bytes — §3.6)
- Τελικά σημεία beacon drand (μόνο για ανάγνωση, για υπογραφές γύρου στιγμής αποκάλυψης)
Οι προορισμοί του embed επιβάλλονται από την CSP του. Οι προβλεπόμενοι προορισμοί του κύριου SPA είναι σταθεροί στον κώδικα και στη διαμόρφωση και ελέγχονται με δοκιμές περιηγητή και ενσωμάτωσης· το Subresource Integrity δεν αποτελεί έλεγχο προορισμού δικτύου.
Το embed ανακτά αποθηκευμένα bytes μέσω των επιτρεπόμενων προελεύσεων qub και αποθήκευσης, ξεπεριτυλίγει ιδιωτικά payloads στον περιηγητή με το K από το fragment URL του και ανακτά υπογραφές γύρου αποκάλυψης από τις δύο επιτρεπόμενες προελεύσεις drand. Το κύριο SPA χρησιμοποιεί το σύνολο τεσσάρων εναλλακτικών endpoints στο config/drand-endpoints.json (drand.cloudflare.com, api.drand.sh, api2.drand.sh και api3.drand.sh) ώστε η διακοπή ενός endpoint να μην εμποδίζει την αποκάλυψη. Η CSP του embed αρνείται συνδέσεις έξω από τη ρητή λίστα της.
5. Υποδομή Πλευράς Διακομιστή
5.1 Serverless Edge
Το API μας τρέχει εξ ολοκλήρου σε διαχειριζόμενο serverless runtime στο edge. Δεν υπάρχουν VMs, ούτε containers, ούτε επίμονες διεργασίες διακομιστή που διαχειριζόμαστε. Αυτό μειώνει δραματικά την επιφάνεια επίθεσης για την οποία είμαστε υπεύθυνοι: δεν τρέχουμε OS, web server, ή application runtime που πρέπει να επιδιορθώσουμε.
Εφαρμόζεται ένα ξεχωριστό middleware δημόσιου CORS Access-Control-Allow-Origin: * στο ακόλουθο υλοποιημένο σύνολο διαδρομών: /embed.js, /embed/v1.js, τα πάντα κάτω από /embed/; /api/v1/telemetry; /api/v1/openapi.json; τα πάντα κάτω από /api/v1/qub/ (συμπεριλαμβανομένων bytes, metadata, proof, engagement, notify, και push υποδρομολογίων)?; όλα κάτω από /api/v1/log/; δημόσιες αναζητήσεις χειριστή κάτω από /api/v1/handle/; και το δημόσιο avatar διαβάζει από κάτω /api/v1/identity/avatar/. Οι άδειες προπτήσης του GET, POST, και OPTIONS με το Content-Type κεφαλίδα αιτήματος. Αυτή η επιφάνεια με βάση το πρόθεμα είναι πιο ευρεία από μόνο τις κλήσεις που κάνει αυτή τη στιγμή η ενσωμάτωση, οπότε κάθε χειριστής κάτω από αυτά τα προθέματα πρέπει να συνεχίσει να εφαρμόζει τη δική του επαλήθευση, αυθεντικοποίηση, όρια ρυθμού και ελέγχους κατάχρησης. Άλλες διαδρομές API διατηρούν την περιορισμένη πολιτική CORS του qub.social.
5.2 Αποθήκευση
- Οι χώροι μεταδεδομένων και συντονισμού κρατούν εγγραφές ταυτότητας και πιστοποίησης, δικαιώματα και αναφορές χρέωσης, εγγραφές κλειδιών API, καταχωρίσεις denylist, συνεδρίες, κατάσταση idempotency, ουρές και κατάσταση περιορισμού ρυθμού ή ταυτόχρονης εκτέλεσης. Διαφορετικές ανάγκες συνέπειας χρησιμοποιούν KV, D1 και Durable Objects αντί για έναν καθολικό χώρο.
- Ο χώρος αντικειμένων μας αποτελεί επίσης υπόστρωμα αντοχής. Κρατά τα ακριβή περιτυλιγμένα ή γυμνά bytes qub που επιβεβαιώθηκαν κατά τη μεταφόρτωση, φύλλα αρχείου διαφάνειας και κόμβους Merkle με κλειδί συντεταγμένων, υλικό αγκύρωσης, δομημένα αρχεία συμβάντων και κρυφές μνήμες αποκρίσεων ή μεταδεδομένων.
- Η μόνιμη δημόσια αποθήκευση κρατά αγκυρώσεις του αρχείου διαφάνειας και, για τη διαδρομή T3 ή αναβαλλόμενη δημοσίευση, μεμονωμένες συναλλαγές qub. Δεν λειτουργούμε αυτό το δίκτυο. Τα ιδιωτικά payloads περιηγητή παραμένουν αδιαφανή εκεί εκτός αν ο κάτοχος διαθέτει και το K· τα δημόσια/γυμνά payloads σκόπιμα δεν έχουν αυτό το πρόσθετο στρώμα δυνατότητας συνδέσμου.
Η προεπιλεγμένη ροή μηνυμάτων του περιηγητή δεν διατηρεί απλό κείμενο στην υποδομή του qub. Το Builder /api/v1/seal χειρίζεται απλό κείμενο και K στη μνήμη, αλλά δεν διατηρεί κανένα από τα δύο. Η προετοιμασία συμφώνου αποθηκεύει αναγκαστικά το υπογεγραμμένο δομημένο σύμφωνο μέχρι να συν-υπογραφεί, να ανακληθεί ή να λήξει. Η προαιρετική ανάκτηση αποθηκεύει μια δυνατότητα παράδοσης, δηλαδή τον πλήρη σύνδεσμο με fragment, ώστε να μπορεί να ανακτηθεί αργότερα. Επομένως δεν περιγράφουμε ολόκληρο το επίπεδο αποθήκευσης ως «μόνο μεταδεδομένα».
5.3 Μυστικά
Τα μυστικά, όπως πορτοφόλια υπογραφής, διακριτικά παρόχων και κλειδιά HMAC, παρέχονται μέσω δεσμεύσεων μυστικών ή περιβάλλοντος της πλατφόρμας και όχι μέσω του πηγαίου κώδικα. Τα στοιχεία runtime λαμβάνουν μόνο τις δεσμεύσεις που χρειάζονται. Οι διαδικασίες ανανέωσης και επικάλυψης είναι ειδικές για κάθε στοιχείο· δεν ισχυριζόμαστε ότι υπάρχει ένας ενιαίος καθολικός αυτόματος ή ελεγμένος μηχανισμός ανανέωσης.
5.4 Καταγραφή και Telemetry
Τα δομημένα JSON logs γράφονται σε κάθε αίτημα API με ένα correlation ID που αναδεικνύεται στην κεφαλίδα απόκρισης X-Request-Id. Η τηλεμετρία πελάτη είναι ανώνυμη — χωρίς αναγνωριστικό συσκευής, χωρίς διεύθυνση IP, χωρίς προεπισκόπηση περιεχομένου. Τα γεγονότα αποθηκεύονται σε buffer στη μνήμη και ξεπλένονται σε καλύτερη προσπάθεια· μια αποτυχημένη ξέπλυμα απορρίπτεται, δεν επαναλαμβάνεται. Η τηλεμετρία είναι σχεδιασμένη να μπορεί να απενεργοποιείται στο επίπεδο δικτύου χωρίς να επηρεάζει το προϊόν.
6. Πιστοποίηση
6.1 Σύνδεση Magic-Link
Η σύνδεση χρησιμοποιεί ένα διακριτικό μίας χρήσης υπογεγραμμένο με HMAC, το οποίο παραδίδεται στα εισερχόμενα του email σας. Ο σύνδεσμος ισχύει για 15 λεπτά και η εξαργύρωση δεσμεύεται ατομικά, ώστε η ταυτόχρονη ή επαναλαμβανόμενη χρήση να αποτυγχάνει με ασφάλεια. Μετά την επιτυχία, ο περιηγητής λαμβάνει ένα αδιαφανές cookie __Host-qub_session με χαρακτηριστικά Secure, HttpOnly, SameSite=Strict και Path=/.
Οι συνεδρίες έχουν όριο αδράνειας 30 ημερών και απόλυτο όριο 90 ημερών, ανανεώνονται μετά από 24 ώρες και δέχονται μόνο την αμέσως προηγούμενη γενιά για περίοδο χάριτος 120 δευτερολέπτων σε περίπτωση χαμένης απόκρισης. Οι ευαίσθητες μεταβολές λογαριασμού απαιτούν πιστοποίηση μέσα στα προηγούμενα 10 λεπτά. Το μυστικό υπογραφής HMAC είναι δέσμευση της πλατφόρμας· η ανάγνωση μόνο των μεταδεδομένων δεν αρκεί από μόνη της για την έκδοση έγκυρου διακριτικού.
6.2 Κλειδιά API (Πακέτο Προγραμματιστή)
Τα κλειδιά Developer API χρησιμοποιούν το πρόθεμα qub_sk_ για εύκολη αναγνώριση και greppability. Κάθε κλειδί:
- Είναι δεσμευμένο σε λογαριασμό, εύρη δικαιωμάτων και προαιρετική λίστα επιτρεπόμενων IP CIDR
- Εμφανίζεται σε ακατέργαστη μορφή μία φορά· οι μόνιμες εγγραφές διατηρούν τη σύνοψη SHA-256 και όχι το μυστικό Bearer
- Μπορεί να ανανεωθεί με αντιστοίχιση χάριτος μίας ώρας, κατά την οποία το παλιό κλειδί επιλύεται στο κλειδί αντικατάστασης
- Έχει ανεξάρτητη κατάσταση ποσοστώσεων και περιορισμού ρυθμού
- Δεν καταγράφεται ποτέ πλήρως· τα logs καταγράφουν μόνο το αναγνωριστικό κλειδιού
Τα τελικά σημεία διαχείρισης admin keys προστατεύονται πίσω από ξεχωριστό διαπιστευτήριο admin.
6.3 Πιστοποίηση Email (Υπογραφή Συγγραφής)
Η σύνδεση μιας διεύθυνσης email με κλειδί υπογραφής απαιτεί:
- Κατοχή του ιδιωτικού κλειδιού υπογραφής (υπογράφετε μια πρόκληση)
- Κατοχή του εισερχόμενου email (εισάγετε έναν 6ψήφιο κωδικό που παραδίδεται μέσω email)
Καθένα από μόνο του είναι ανεπαρκές. Η ανάκληση είναι μια υπογεγραμμένη εγγραφή στον δικό σας λογαριασμό και τίθεται σε ισχύ άμεσα· θεατές που ανακτούν την πιστοποίηση βλέπουν την ανακαλεσμένη κατάσταση και εμφανίζουν αναλόγως.
7. Πληρωμές
Η εισαγωγή και η επεξεργασία στοιχείων κάρτας εκτελούνται στο checkout που φιλοξενεί το Stripe. Δεν λαμβάνουμε ποτέ αριθμούς κάρτας, ημερομηνίες λήξης ή CVC. Αποθηκεύουμε αναγνωριστικά πελάτη και συνδρομής του Stripe, την κατάσταση συνδρομής και δεδομένα περιόδου στις εγγραφές δικαιωμάτων ή κλειδιών API, ώστε να μπορούν να συμφωνούνται η πρόσβαση, οι ανανεώσεις, η μέτρηση, η ακύρωση και οι επιστροφές χρημάτων. Οι δηλώσεις απορρήτου και ασφάλειας του Stripe διέπουν τον χειρισμό των δεδομένων πληρωμής από αυτό.
Το τελικό σημείο σφραγίδας ελέγχει διασταυρωτικά την εγγραφή δικαιώματος έναντι του αναγνωριστικού συσκευής και, για συνδεδεμένους χρήστες, έναντι της συνδεδεμένης ταυτότητας. Ένα δικαίωμα δεν μπορεί να επαναχρησιμοποιηθεί σε όλες τις συσκευές χωρίς ο χρήστης να το αποκαταστήσει ρητά μέσω σύνδεσης magic-link.
8. Αντίσταση Κατάχρησης
8.1 Ανίχνευση Bot
Η ροή σφράγισης προστατεύεται από μια εναλλακτική CAPTCHA που σέβεται το απόρρητο και δεν χρησιμοποιεί cookies για παρακολούθηση και δεν δημιουργεί αποτύπωμα συσκευής για διαφήμιση. Μια αποτυχημένη πρόκληση απορρίπτεται από τον edge Worker μας πριν συμβεί οποιαδήποτε επεξεργασία πλευράς σφράγισης.
8.2 Περιορισμός Ρυθμού
Οι περιορισμοί ρυθμού επιβάλλονται σε αρκετά επίπεδα:
- Όρια ανά IP και ανά κλειδί σε τελικά σημεία σφραγίδας, ανάγνωσης, και πιστοποίησης
- Όρια ανά email σε αιτήματα magic-link (αποτρέπει την πλημμύρα γραμματοκιβωτίου)
- Όρια ανά αντισυμβαλλόμενο σε emails πρόσκλησης συμφώνου (δέκα ανά διεύθυνση παραλήπτη ανά ημέρα UTC, ο κύριος μηχανισμός κατά του spam-relay· τα τίμια σύμφωνα σχεδόν ποτέ δεν πλησιάζουν το όριο)
- Όρια ανά IP σε υποβολή τηλεμετρίας
Οι μετρητές και οι ατομικές δεσμεύσεις κατανέμονται μεταξύ KV, Durable Objects και δεσμεύσεων περιορισμού ρυθμού της πλατφόρμας ανάλογα με τις απαιτήσεις συνέπειας κάθε endpoint. Τα αιτήματα που περιορίζονται επιστρέφουν 429· τα endpoints που μπορούν να υπολογίσουν παράθυρο επανάληψης περιλαμβάνουν Retry-After.
8.3 Εποπτεία Περιεχομένου
Η προεπιλεγμένη διαδρομή ανάρτησης μέσω προγράμματος περιήγησης δεν μπορεί να σαρώσει το σώμα: λαμβάνει μόνο το αντικείμενο σφραγισμένο από τον πελάτη. Ο Κατασκευαστής /api/v1/seal η διαδρομή βλέπει το απλό κείμενο προσωρινά, και η διαμόρφωση της συμφωνίας κρατά δομημένους όρους μέχρι την ολοκλήρωση, αλλά αυτές οι εξαιρέσεις εμπιστοσύνης δεν μετατρέπουν τη γενική διαδρομή μεταφόρτωσης τυφλή ως προς τα bytes σε σαρωτή περιεχομένου. Η λειτουργική εποπτεία είναι μια λίστα απόρριψης στο επίπεδο του θεατή: ένα qub που βρίσκεται στη λίστα άρνησης απορρίπτεται από τον θεατή μας ανεξαρτήτως του αν το αποθηκευμένο περιεχόμενο παραμένει προσβάσιμο. Η τοποθέτηση στη λίστα άρνησης δεν ανακαλεί ανθεκτικά bytes, εγγραφές στο transparency log ή δεδομένα μόνιμου δικτύου που έχουν ήδη δημοσιευθεί.
Οι αναφορές κατάχρησης περιορίζονται σε ρυθμό χρησιμοποιώντας μονόδρομη σύνοψη της IP του αναφέροντος· δεν αποθηκεύουμε IPs σε καθαρή μορφή γι' αυτόν τον σκοπό.
9. Αλυσίδα Εφοδιασμού και Ακεραιότητα Κατασκευής
9.1 Καρφίτσωμα Toolchain
Οι εκδόσεις compiler και runtime είναι καρφιτσωμένες στη διαμόρφωση του αποθετηρίου και οι εξαρτήσεις επιλύονται μέσω δεσμευμένων lockfiles. Το CI ελέγχει τη φρεσκάδα των παραγόμενων αρχείων και invariants που επηρεάζουν την αναπαραγωγιμότητα. Δεν διατυπώνουμε τον ισχυρότερο ισχυρισμό ότι κάθε καθαρή κατασκευή είναι πανομοιότυπη bit προς bit σε όλα τα υποστηριζόμενα μηχανήματα.
9.2 Lints και Στατική Ανάλυση
Ο χώρος εργασίας ενεργοποιεί τις αυστηρότερες ομάδες lint μας στο επίπεδο deny. Το CI αντιμετωπίζει κάθε προειδοποίηση — συμπεριλαμβανομένων των προειδοποιήσεων συνδέσμων τεκμηρίωσης — ως αποτυχία κατασκευής. Αυτό είναι σκόπιμο: χρησιμοποιούμε την αυστηρότητα lint ως tripwire για διακριτικές παλινδρομήσεις.
9.3 Πύλες CI
Η ροή εργασίας CI καλύπτει μορφοποίηση και αυστηρά lints· δοκιμές Rust, WASM/περιηγητή, Worker, embed και API· έλεγχο τύπων· κάλυψη κώδικα· ελέγχους μεταλλάξεων και invariants· στατική ανάλυση εξαρτήσεων και ροών εργασίας· κλειδιά i18n, κάλυψη, απόκλιση και εχθρικά σημεία κώδικα· φρεσκάδα παραγόμενης τεκμηρίωσης, API και βάσης γνώσεων· απογραφή εγγράφων και εσωτερικούς συνδέσμους· προϋπολογισμούς stylesheet και bundle· και επικύρωση OpenAPI. Ορισμένες ακριβές εργασίες μεταλλάξεων εκτελούνται προγραμματισμένα και όχι σε κάθε push.
Ένα ενιαίο απαιτούμενο συγκεντρωτικό ci παραμένει κόκκινο αν αποτύχει οποιαδήποτε απαιτούμενη εργασία. Οι ροές προστατευμένων κλάδων και ανάπτυξης χρησιμοποιούν αυτό το αποτέλεσμα αντί να επαναλαμβάνουν μια μικρότερη πύλη ασφάλειας.
9.4 Mutation Testing
Μια εβδομαδιαία εργασία τρέχει mutation testing έναντι των κρίσιμων για ασφάλεια καθαρών modules: hashing, canonical CBOR, seal, unlock, τα newtypes μορφής καλωδίου, οι επικυρωτές τύπου πρωτοκόλλου, και το handle namespace. Το mutation testing απαντά «η σουίτα τεστ μας πιάνει διακριτικά λανθασμένο κώδικα;» — αν μια μεταλλαγμένη υλοποίηση εξακολουθεί να περνά όλα τα τεστ, ξέρουμε ότι έχουμε κενό κάλυψης τεστ και το αντιμετωπίζουμε.
9.5 Git Hooks
Τα τοπικά hooks (pre-commit, pre-push) αντικατοπτρίζουν τις πύλες CI ώστε οι παλινδρομήσεις να πιάνονται πριν φύγουν από τη μηχανή του προγραμματιστή. Τα hooks εγκαθίστανται μέσω script αποθετηρίου· δεν παρακάμπτονται στη ροή εργασίας μας και το CI είναι η αυθεντική πύλη αν παρακαμφθούν.
10. Δοκιμές
Ο κρίσιμος για ασφάλεια κώδικας φέρει τρία είδη δοκιμών:
- Unit tests επαληθεύουν την αναμενόμενη συμπεριφορά σε γνωστές εισόδους, συμπεριλαμβανομένων test vectors που προέρχονται από την προδιαγραφή πρωτοκόλλου.
- Property tests δημιουργούν χιλιάδες αυθαίρετες εισόδους και διεκδικούν invariants: κανονικά CBOR round-trips, round-trips επαλήθευσης υπογραφής, predicate δέσμευσης email, ντετερμινισμός αναγνώρισης συμφώνου.
- Cross-implementation tests επαληθεύουν ότι οι υλοποιήσεις πελάτη και διακομιστή μας συμφωνούν byte-προς-byte σε κανονικές κωδικοποιήσεις. Αυτό πιάνει την απόκλιση μεταξύ των δύο υλοποιήσεων πριν φτάσει στην παραγωγή.
11. Υγιεινή Κλάδου και Έκδοσης
Οι κλάδοι λειτουργιών προωθούν το staging μόνο μέσω pull request της Πύλης 1: το απαιτούμενο ci είναι πράσινο, δεν υπάρχει ανεπίλυτο αίτημα αλλαγής ή σύγκρουση συγχώνευσης και το ελεγμένο δέντρο είναι καθαρό· η συγχώνευση γίνεται με squash και διαγραφή. Το main προχωρά μόνο μέσω του pull request Πύλης 2 staging → main και διατηρεί την καταγωγή με merge commit. Τα απευθείας pushes στους κλάδους δεν αποτελούν τη ροή έκδοσης.
Οι αναπτύξεις staging και παραγωγής ενεργοποιούνται από τις αντίστοιχες καταστάσεις των προστατευμένων κλάδων staging και main μετά το CI. Ο κώδικας pull request και τα διαπιστευτήρια forks δεν λαμβάνουν μυστικά ανάπτυξης.
Τα μυστικά που χρησιμοποιούνται σε ροές εργασίας ανάπτυξης είναι περιορισμένα στο περιβάλλον ανάπτυξης από την πλατφόρμα CI μας. Δεν είναι διαθέσιμα σε ροές εργασίας pull-request από forks.
12. Συντονισμένη Αποκάλυψη
Αν πιστεύετε ότι έχετε βρει ευπάθεια ασφαλείας στο qub, θέλουμε να το ακούσουμε γρήγορα και δεσμευόμαστε να χειριστούμε την αναφορά επαγγελματικά.
- Στείλτε email στο
support@qub.socialμε το πρόθεμα θέματος[SECURITY]. - Περιγράψτε την ευπάθεια, βήματα αναπαραγωγής, και οποιοδήποτε proof-of-concept.
- Δώστε μας εύλογο παράθυρο αποκάλυψης (τυπικά 90 ημέρες) πριν δημοσιοποιήσετε.
- Μην έχετε πρόσβαση σε δεδομένα που δεν σας ανήκουν, μην υποβαθμίζετε την υπηρεσία για άλλους χρήστες, ή μην διατηρείτε δεδομένα που αποκτήθηκαν κατά την έρευνα πέρα από όσο είναι απαραίτητο για να αποδείξετε το ζήτημα.
Επιβεβαιώνουμε τη λήψη εντός τριών εργάσιμων ημερών και σας κρατάμε ενημερωμένους καθώς ερευνούμε. Με τη συναίνεσή σας, πιστώνουμε αναφέροντες σε σημειώσεις έκδοσης.
12.1 Safe Harbor
Αν η έρευνά σας ακολουθεί τους παραπάνω κανόνες (έρευνα καλής πίστης, καμία βλάβη σε άλλους χρήστες ή την υπηρεσία, εύλογο παράθυρο αποκάλυψης), δεν θα ασκήσουμε νομική δράση εναντίον σας, και δεν θα ζητήσουμε από τις αρχές επιβολής του νόμου να το κάνουν. Αντιμετωπίζουμε τη δουλειά σας ως εξουσιοδοτημένο testing και θα προτιμούσαμε να βρείτε το bug εσείς παρά κάποιος άλλος.
Αυτό το Safe Harbor εφαρμόζεται σε:
- Έρευνα στην ζωντανή υπηρεσία qub.social (όχι σε test fixtures που δημοσιεύουμε γι' αυτόν τον σκοπό).
- Αντίστροφη μηχανική των δημοσιευμένων binaries μας και των open-source crates qub-core / qub-app.
- Οποιαδήποτε κατηγορία ευπάθειας — πρωτοκόλλου, εφαρμογής, υποδομής, αλυσίδας εφοδιασμού — που επηρεάζει το qub.
Δεν εφαρμόζεται σε social engineering μελών της ομάδας qub, denial-of-service tests, ή πρόσβαση σε δεδομένα άλλων χρηστών πέρα από όσο χρειάζεται για να αποδείξετε το ζήτημα. Αν δεν είστε σίγουροι αν κάτι εμπίπτει εντός του Safe Harbor, ρωτήστε πρώτα χρησιμοποιώντας το ίδιο πρόθεμα θέματος [SECURITY].
13. Ειλικρινείς Περιορισμοί
Η ασφάλεια είναι πρακτική, όχι κατάσταση. Ορισμένοι περιορισμοί αξίζει να ονομαστούν άμεσα:
- Είμαστε μια μικρή ομάδα. Το βάθος αναθεώρησής μας δεν ταιριάζει με την αφιερωμένη λειτουργία ασφάλειας εφαρμογών μιας μεγάλης εταιρείας. Αντισταθμίζουμε με αυστηρές αυτοματοποιημένες πύλες και ελάχιστη επιφάνεια επίθεσης, αλλά δεν διεκδικούμε αλάθεια.
- Η μονιμότητα του backend αποθήκευσής μας είναι μονόδρομη πόρτα. Αν ένα λάθος προκαλέσει το σφραγισμένο περιεχόμενο να γίνει αποκρυπτογραφήσιμο νωρίτερα από το προοριζόμενο, δεν μπορούμε να το αναιρέσουμε. Αντιμετωπίζουμε τη ροή σφράγισης με ανάλογη προσοχή.
- Το δίκτυο drand είναι εξωτερική εξάρτηση. Μια καταστροφική αποτυχία του drand θα επηρέαζε τη συμπεριφορά αποκάλυψης κάθε qub. Παρακολουθούμε την υγεία του drand και έχουμε τεκμηρίωση εφεδρείας για μετανάστευση αλυσίδας αν χρειαστεί. Για ημερομηνίες ξεκλειδώματος με ορίζοντα άνω των 2 ετών, το modal επιβεβαίωσης χρόνου σφραγίδας εμφανίζει ρητή αποκάλυψη: τα qubs μακροπρόθεσμου ορίζοντα εξαρτώνται από την ανθεκτικότητα της αλυσίδας drand, και μια μελλοντική μετανάστευση αλυσίδας drand μπορεί να απαιτεί βήματα ανάκτησης για να ξεκλειδωθεί το qub. Για ημερομηνίες ξεκλειδώματος με ορίζοντα άνω των 5 ετών, πρέπει να επιλέξετε ένα επιπλέον κουτί επιβεβαιώνοντας ότι έχετε διαβάσει και αποδεχτεί αυτόν τον κίνδυνο πριν προχωρήσει η σφραγίδα.
- Οι κρυπτογραφικές πρωταρχικές στις οποίες βασιζόμαστε είναι τυποποιημένες και ευρέως αναθεωρημένες, αλλά η κρυπτογραφία εξελίσσεται. Όπου έχουμε επιλογές (μετα-κβαντική υπογραφή, πιστοποιημένη κρυπτογράφηση), επιλέγουμε τη πιο συντηρητική επιλογή.
14. Αλλαγές σε αυτή τη Σελίδα
Οι σημαντικές αλλαγές σημειώνονται ενημερώνοντας την ημερομηνία ισχύος στο επάνω μέρος. Όπου μια αλλαγή αντικατοπτρίζει συγκεκριμένη βελτίωση ασφαλείας, την περιγράφουμε εν συντομία στο δημόσιο changelog. Όπου μια αλλαγή αντικατοπτρίζει διευκρίνιση πολιτικής, περιγράφουμε τι άλλαξε και γιατί.
Για ερωτήσεις σχετικά με οτιδήποτε σε αυτή τη σελίδα, στείλτε email στο support@qub.social με το πρόθεμα θέματος [SECURITY].
15. Αρχείο Αλλαγών
| Έκδοση | Ημερομηνία ισχύος | Σύνοψη |
|---|---|---|
| 1.1 | 23 Σεπτεμβρίου 2026 | Συμφιλιώθηκαν οι κρυπτογραφικοί ισχυρισμοί, οι τρόποι παράδοσης, η αποθήκευση, η CSP, οι συνεδρίες, τα κλειδιά API, οι πληρωμές, το CI και η ροή έκδοσης με το υλοποιημένο σύστημα. |
| 1.0 | 2 Μαΐου 2026 | Αρχική δημοσίευση. |