Ασφάλεια στο qub

Ημερομηνία ισχύος: 23 Σεπτεμβρίου 2026 Έκδοση: 1.1 — έλεγχος ακρίβειας υλοποίησης


Για ερευνητές — γρήγορη αναφορά:

Πλήρεις λεπτομέρειες στο §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 και τυχόν υπογραφές συγγραφής. Η διατήρηση αυτών των ισχυρισμών διακριτών είναι το πρότυπο αυτής της σελίδας.

Δεν σας ζητάμε να μας εμπιστευθείτε. Σχεδιάζουμε ώστε η εμπιστοσύνη που απαιτείται από εμάς να είναι όσο το δυνατόν μικρότερη, και όπου απαιτείται εμπιστοσύνη εξηγούμε ακριβώς τι εμπιστεύεται και γιατί.

Τρεις αρχές οδηγούν κάθε σχεδιαστική απόφαση:


2. Μοντέλο Απειλής

2.1 Από Τι Προστατεύουμε

2.2 Από Τι Δεν Μπορούμε να Προστατεύσουμε

Είμαστε ειλικρινείς σχετικά με τα όρια μας. Το qub δεν μπορεί να αμυνθεί κατά:


3. Κρυπτογραφία στην Πλευρά του Πελάτη

Στην προεπιλεγμένη ροή μηνυμάτων του περιηγητή, η κρυπτογράφηση περιεχομένου γίνεται πριν από το αίτημα μεταφόρτωσης. Δύο ρητές διαδρομές διαφέρουν: το Builder /api/v1/seal στέλνει σκόπιμα απλό κείμενο και K που δημιουργήθηκε από τον καλούντα στον Worker για σφράγιση στη μνήμη, ενώ η προετοιμασία και συν-υπογραφή συμφώνου στέλνει το υπογεγραμμένο δομημένο σύμφωνο στην υπηρεσία ώστε να ολοκληρώσει το διμερές τεκμήριο. Καμία από αυτές τις εξαιρέσεις δεν πρέπει να συγχέεται με κρυπτογράφηση από άκρο σε άκρο της διαδρομής του περιηγητή.

3.1 Timelock Encryption

Το qub χρησιμοποιεί tlock — κρυπτογράφηση βασισμένη σε ταυτότητα με κλειδί έναν μελλοντικό γύρο drand beacon. Η κρυπτογράφηση προχωρά στο πρόγραμμα περιήγησής σας χρησιμοποιώντας το δημόσιο κλειδί του δικτύου drand· το κλειδί αποκρυπτογράφησης απελευθερώνεται δημόσια από το δίκτυο drand μόνο όταν επιτευχθεί ο στοχευμένος γύρος. Κανείς, συμπεριλαμβανομένων μας, δεν μπορεί να ανακατασκευάσει το κλειδί αποκρυπτογράφησης εκ των προτέρων.

Στοχεύουμε στην αλυσίδα quicknet:

Το δημόσιο κλειδί και ο χρόνος γέννησης της αλυσίδας 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.

Καθαρές συνέπειες:

Το 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 μόνο σε:

Οι προορισμοί του 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 Αποθήκευση

Η προεπιλεγμένη ροή μηνυμάτων του περιηγητή δεν διατηρεί απλό κείμενο στην υποδομή του 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. Κάθε κλειδί:

Τα τελικά σημεία διαχείρισης admin keys προστατεύονται πίσω από ξεχωριστό διαπιστευτήριο admin.

6.3 Πιστοποίηση Email (Υπογραφή Συγγραφής)

Η σύνδεση μιας διεύθυνσης email με κλειδί υπογραφής απαιτεί:

  1. Κατοχή του ιδιωτικού κλειδιού υπογραφής (υπογράφετε μια πρόκληση)
  2. Κατοχή του εισερχόμενου email (εισάγετε έναν 6ψήφιο κωδικό που παραδίδεται μέσω email)

Καθένα από μόνο του είναι ανεπαρκές. Η ανάκληση είναι μια υπογεγραμμένη εγγραφή στον δικό σας λογαριασμό και τίθεται σε ισχύ άμεσα· θεατές που ανακτούν την πιστοποίηση βλέπουν την ανακαλεσμένη κατάσταση και εμφανίζουν αναλόγως.


7. Πληρωμές

Η εισαγωγή και η επεξεργασία στοιχείων κάρτας εκτελούνται στο checkout που φιλοξενεί το Stripe. Δεν λαμβάνουμε ποτέ αριθμούς κάρτας, ημερομηνίες λήξης ή CVC. Αποθηκεύουμε αναγνωριστικά πελάτη και συνδρομής του Stripe, την κατάσταση συνδρομής και δεδομένα περιόδου στις εγγραφές δικαιωμάτων ή κλειδιών API, ώστε να μπορούν να συμφωνούνται η πρόσβαση, οι ανανεώσεις, η μέτρηση, η ακύρωση και οι επιστροφές χρημάτων. Οι δηλώσεις απορρήτου και ασφάλειας του Stripe διέπουν τον χειρισμό των δεδομένων πληρωμής από αυτό.

Το τελικό σημείο σφραγίδας ελέγχει διασταυρωτικά την εγγραφή δικαιώματος έναντι του αναγνωριστικού συσκευής και, για συνδεδεμένους χρήστες, έναντι της συνδεδεμένης ταυτότητας. Ένα δικαίωμα δεν μπορεί να επαναχρησιμοποιηθεί σε όλες τις συσκευές χωρίς ο χρήστης να το αποκαταστήσει ρητά μέσω σύνδεσης magic-link.


8. Αντίσταση Κατάχρησης

8.1 Ανίχνευση Bot

Η ροή σφράγισης προστατεύεται από μια εναλλακτική CAPTCHA που σέβεται το απόρρητο και δεν χρησιμοποιεί cookies για παρακολούθηση και δεν δημιουργεί αποτύπωμα συσκευής για διαφήμιση. Μια αποτυχημένη πρόκληση απορρίπτεται από τον edge Worker μας πριν συμβεί οποιαδήποτε επεξεργασία πλευράς σφράγισης.

8.2 Περιορισμός Ρυθμού

Οι περιορισμοί ρυθμού επιβάλλονται σε αρκετά επίπεδα:

Οι μετρητές και οι ατομικές δεσμεύσεις κατανέμονται μεταξύ 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. Δοκιμές

Ο κρίσιμος για ασφάλεια κώδικας φέρει τρία είδη δοκιμών:


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, θέλουμε να το ακούσουμε γρήγορα και δεσμευόμαστε να χειριστούμε την αναφορά επαγγελματικά.

Επιβεβαιώνουμε τη λήψη εντός τριών εργάσιμων ημερών και σας κρατάμε ενημερωμένους καθώς ερευνούμε. Με τη συναίνεσή σας, πιστώνουμε αναφέροντες σε σημειώσεις έκδοσης.

12.1 Safe Harbor

Αν η έρευνά σας ακολουθεί τους παραπάνω κανόνες (έρευνα καλής πίστης, καμία βλάβη σε άλλους χρήστες ή την υπηρεσία, εύλογο παράθυρο αποκάλυψης), δεν θα ασκήσουμε νομική δράση εναντίον σας, και δεν θα ζητήσουμε από τις αρχές επιβολής του νόμου να το κάνουν. Αντιμετωπίζουμε τη δουλειά σας ως εξουσιοδοτημένο testing και θα προτιμούσαμε να βρείτε το bug εσείς παρά κάποιος άλλος.

Αυτό το Safe Harbor εφαρμόζεται σε:

Δεν εφαρμόζεται σε social engineering μελών της ομάδας qub, denial-of-service tests, ή πρόσβαση σε δεδομένα άλλων χρηστών πέρα από όσο χρειάζεται για να αποδείξετε το ζήτημα. Αν δεν είστε σίγουροι αν κάτι εμπίπτει εντός του Safe Harbor, ρωτήστε πρώτα χρησιμοποιώντας το ίδιο πρόθεμα θέματος [SECURITY].


13. Ειλικρινείς Περιορισμοί

Η ασφάλεια είναι πρακτική, όχι κατάσταση. Ορισμένοι περιορισμοί αξίζει να ονομαστούν άμεσα:


14. Αλλαγές σε αυτή τη Σελίδα

Οι σημαντικές αλλαγές σημειώνονται ενημερώνοντας την ημερομηνία ισχύος στο επάνω μέρος. Όπου μια αλλαγή αντικατοπτρίζει συγκεκριμένη βελτίωση ασφαλείας, την περιγράφουμε εν συντομία στο δημόσιο changelog. Όπου μια αλλαγή αντικατοπτρίζει διευκρίνιση πολιτικής, περιγράφουμε τι άλλαξε και γιατί.

Για ερωτήσεις σχετικά με οτιδήποτε σε αυτή τη σελίδα, στείλτε email στο support@qub.social με το πρόθεμα θέματος [SECURITY].


15. Αρχείο Αλλαγών

Έκδοση Ημερομηνία ισχύος Σύνοψη
1.1 23 Σεπτεμβρίου 2026 Συμφιλιώθηκαν οι κρυπτογραφικοί ισχυρισμοί, οι τρόποι παράδοσης, η αποθήκευση, η CSP, οι συνεδρίες, τα κλειδιά API, οι πληρωμές, το CI και η ροή έκδοσης με το υλοποιημένο σύστημα.
1.0 2 Μαΐου 2026 Αρχική δημοσίευση.