←back to thread

475 points danielstocks | 4 comments | | HN request time: 0.003s | source
Show context
ipsin ◴[] No.27303148[source]
What are the ways you can implement "log in as anyone accidentally"?

I'm imagining it was a case of an SQL-based password check where "TRUE OR" got added to the WHERE clause, and the code takes the first result instead of expecting only 0 or 1 row.

Are there other easy ways to do this?

replies(3): >>27303178 #>>27303237 #>>27303253 #
1. ladon86 ◴[] No.27303253[source]
1) Caching: a cache is used in front of the API for things like product listings, it uses a pattern match like /api/products/*, and caches routes which match. Someone accidentally configures it to cache /api/*, and thus login responses from /api/session return another recent user session, potentially including the cookie such that subsequent requests are authenticated as that user.

2) Mentioned elsewhere in this thread, a variable with global scope within an application server. This is very possible in node.js, which uses a long-running single thread - if you have a function like handleRequest(), you might inadvertently write to a global variable outside it, and that variable will persist across requests from different users. I've seen this exact bug in a PR - luckily we caught it before production, but if it had slipped through code review and integration tests and actually shipped, the result would have been exactly like the one in the tweet.

replies(2): >>27303498 #>>27303576 #
2. formerly_proven ◴[] No.27303498[source]
It can be a bug in the application server as well, I recall uwsgi having issues where the request (or response, not sure) dictionaries were recycled between requests, and some corner cases didn't clear those between handling different requests, or something to that tune.
3. axiosgunnar ◴[] No.27303576[source]
Why do users get multiple other users instead of one then, if it's a global variable? I assume because Klarna is running on many servers?
replies(1): >>27303815 #
4. pfraze ◴[] No.27303815[source]
It could also be that new logins overwrite the cache/global