- Expédié
- 19 août 2026 à 08:09 UTC
- Auteur
- Kamo
- Commite
- 19ddc01
Deux moitiés d'un incident. Un compte enregistré, vérifié une adresse à un établissement jetable le fournisseur, a pris une session d'auto-connexion et a créé cinq organisations en trois minutes et quarante-deux secondes - quatre d'entre eux-mêmes - des rangées "Acme Corp" identiques ne diffèrent que par leur domaine. Il a produit des lignes "ERO" dans system-access-logs, donc il n'y a pas d'IP et pas d'agent utilisateur dans l'enregistrement de l'un quelconque de ses membres. - Enforçant le drapeau - UserAuthenticationService: zu.is-fake et FALSE-ANALISE-FALSE-AVOIR-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE-FALSE- un appelant. Les trois identifiants de connexion - nom d'utilisateur, e-mail du compte et la boîte de messagerie primaire re-lookup cléed by id - réutiliser cette projection, de sorte qu'une clause côtoit les trois et un Un quatrième identifiant ajouté plus tard, il hérite. Un compte signalé se lit comme inexistant et reçoit le médicament générique "l'utilisateur n'existe pas ou le mot de passe est incorrect"; un message nommant le Un drapeau dirait à un agresseur exactement ce qu'il faut changer. - KSessionService.createSession: refuse purement et simplement. C'est la taille la plus étroite de la système pour "peut ce compte agir" - tous - est frappé ici, de sorte qu'une porte couvre Connecteur de mot de passe, entrée en tant qu'auprès, SSO de bureau, authentificateur de l'appareil ET de l'entonnoir du registre auto-login post-vérification, qui est la façon dont le compte en question a obtenu une session sans jamais appeler /login. Jette plutôt que de revenir nul, parce que trente appelants assumer un id non nul et le NPE se contenterait d'ailleurs; se connecter et la prise de possession automatique chemin l'attraper et façonner une réponse propre. - Faux comptableGuard : deux niveaux à volonté. Le chèque à compte unique est UNCACHED (il recule). les portes dures, où une réponse périmée signifie qu'un compte signalé entre toujours); les ensembles d'identification sont mis en cache pour les années 60 (ils lisent en arrière le filtrage, où le pire cas est un org synthétique s'attardant dans une liste pendant moins d'une minute). Éche-toi ouverte et cacher une poignée de menseries n'est pas la valeur d'une liste d'orgges - et ne cache PAS un échec, donc un blip ne devient pas une minute du drapeau qui ne fonctionne pas silencieusement. - OrgObjectStorageSweep: arrête snapshont les orges synthétiques. C'est là que l'argent était: des instantanés sont écrits par org par jour pour toujours, et cinq orgs abandonnés avaient déjà deviennent plus de 9 % de ce tableau. Un compte qui ne peut pas se connecter ne fait rien à propos du travail La plate-forme ne cesse de faire en son nom. - Faux compteurContrôleur : drapeau, non-faulet, liste et derrière les organisations à l'égard des organisations plutôt qu'une une nouvelle plate-forme à droite, parce que la plate-forme de kamo-interne en position contre les surfaces restituées de la console. Rupce des sessions en direct sur le signe, depuis les portes sont sur MINTING une session, pas sur l'utilisation d'une; refuse de signaler l'utilisateur du système, qui rendrait la plate-forme incapable d'entrer dans une organisation d'un enfant. Les trous -/registrer ne jamais lire "Token". Le registre UI a toujours résolu un Capcha défi et a affiché le résultat; grep pour le terrain à travers tous les Java n'a rien retourné. Le widget était dans le navigateur et le point d'extrémité était grand ouvert. Maintenant vérifié, et FAIL FERMÉ - asymétrique avec la connexion à dessein: la connexion ne peut vérifier une charge utile que lorsqu'une charge utile est présent, parce que le client mobile n'en envoie aucun et le devoir de l'y accrocher les vrais utilisateurs. L'enregistrement a exactement un client et il envoie déjà le jeton. - CapchaVerificationService a renvoyé TRUE lorsque 'capcha.service-url' était en désactivé, donc une configuration l'omission n'était pas distinguable d'un défi résolu. Maintenant, rejette, derrière (par défaut) pour les parcours locaux. Pas de changement de production - le La propriété est située dans la configuration de la pacows-security - mais la rocade latente a disparu. - POST/org n'avait aucune limite de taux d'aucune sorte. Maintenant plafonné par COMPTE (pas par IP et clé IP punirait tout le monde derrière une NAT d'entreprise). Délibérément généreux: un vrai client a créé trois orges en cinq minutes et demie, deux portant le même nom et le même alias, tandis que élaborer le magicien. Une limite serrée les aurait bloquées. Comptabilité des tentatives, pas succès, et échoue à l'ouverture d'une panne de Redis. - L'analysme n'avait PAS de contrôle de caractère unique sur cette voie - seul le domaine l'a fait, c'est pourquoi quatre gisements vivants partagent "acme-corp" et pourquoi le créateur ne variait que le domaine à chaque fois: C'était le seul champ que le serveur rejetterait. Maintenant, un 409, mené auprès du fournisseur de sécurité parce que '(security'provider'id, alias) est la connexion de paire résout un hôte web-alias. - INSCRÉMENT / REGISTRATION-REJETÉ / EMAIL-VERIFIED / ORG-CRÉMENTÉS sont maintenant écrits avec IP et utilisateur-agent. Chaque règle de détection touche les événements de connexion, donc l'ensemble du registre l'entonnoir se trouve en dehors du champ de vision du moteur de détection. NE PAS faire délibérément, après vérification: la connexion n'est pas effectuée -strict (brisant le mobile app, a besoin d'une version coordonnée); les domaines de courrier électronique jetable ne sont pas bloqués (un réel les signes du client sur proton.me, et une règle "pas un fournisseur majoritaire" bloque le réel personnes) ; pas de bloc auto-sanglanté (le signal comportemental à l'aspect le plus fort) noms doublons créés à quelques minutes - correspond exactement à un client réel). Schema préalable déjà satisfait: KamoInitializer a appliqué les utilisateurs.is-fake avant le partage-lib push, vérifié comme "boolean NOT NULL DEFAULT false" avec son index partiel, et Re-ran idempotentement sans éblouir le drapeau.