556

News reports such as this one indicate that the above number may have arisen as a programming bug.

A man in the United States popped out to his local petrol station to buy a pack of cigarettes - only to find his card charged $23,148,855,308,184,500.

That is $23 quadrillion (£14 quadrillion) - many times the US national debt.*

In hex it's $523DC2E199EBB4 which doesn't appear terribly interesting at first sight.

Anyone have any thoughts about what programming error would have caused this?

Russia Must Remove Putin
  • 374,368
  • 89
  • 403
  • 331
Roddy
  • 66,617
  • 42
  • 165
  • 277
  • 31
    bored gas station attendent? – txwikinger Jul 15 '09 at 19:54
  • 3
    I was just wondering the same when I read an article on CNN about this. Especially since my company charges credit cards. This is the kind of potential bug that keeps me awake at night. – Dinah Jul 15 '09 at 19:54
  • @txwikinger: nope. Error in Visa's code – Dinah Jul 15 '09 at 19:56
  • 217
    Well Obama did say that he had a new stimulus plan in the works to ease the deficit... – Christopher Klein Jul 15 '09 at 19:56
  • 1
    I understand that Visa and other credit-card companies typically charge a 1 to 3% comission on transactions. On this transaction, that would be over 200 Billion dollars. I believe they should have logic that requires human approval for any transaction over $100,000 (eg. $1,000 comission). – abelenky Jul 15 '09 at 19:58
  • 25
    Exactly what kind of credit card does this guy have that that transaction went through and triggered a mere $15 in overdraft fees... Gas station also probably unhappy about the 2% credit card processing fee on that. – Nick Bastin Jul 15 '09 at 19:59
  • 42
    Easter egg from a programmer that is soon to be fired ;) – Matthew Whited Jul 15 '09 at 19:59
  • @Christopher I really like that. One John Doe will now be financing our country, everyone else is exempt from taxes. Here's $100 for good measure. – samoz Jul 15 '09 at 20:03
  • 1
    See http://www.theregister.co.uk/2009/07/15/quadrillion_dollar_visa_overcharge/ – Nathan Koop Jul 15 '09 at 20:11
  • @tim. I guess it's may not be sufficiently "programming-related". However, I've got a 'real' answer, so I feel it's a real question! – Roddy Jul 15 '09 at 20:15
  • What I don't understand is why he got a bill for a prepaid card. – Nosredna Jul 15 '09 at 20:18
  • @nosredna - I am guessing that you pay some amount up front (say $1000) and then you get statements periodically showing how much is left on it. I don;t know though – Tim Jul 16 '09 at 02:18
  • 1
    @Dinah: no, I think this is a trivial (by perception, not by actual complexity) bug. Nobody* will actually believe they owe that amount. *FSVO nobody. – Adriano Varoli Piazza Jul 16 '09 at 14:32
  • 5
    Not that many times the national debt, unfortunately. – John Jul 16 '09 at 17:56
  • 28
    Maybe this is some kind of new anti-smoking campaign. ("See how much smoking really costs you!" :-) – Slapout Jul 16 '09 at 18:02
  • @Adriano like no one believes RIAA will sue Jamie Thomas-Rasset 1.92 Million USD for 24 songs downloaded? http://arstechnica.com/tech-policy/news/2009/06/jammie-thomas-retrial-verdict.ars – pageman Aug 09 '09 at 07:39
  • 1
    if about 13000 people from a population of 303 million were affected, then the chance of it happening (13000/303000000 = 4.3e-5) puts it on the same order of magnitude as an uninitialised 16 bit number having a specific value. Just sayin'. (1/65535=1.5e-5) (I know that population != credit card transactions, but I don't have any statistics on those) – Markus Aug 09 '09 at 09:04
  • Newly enacted cigarette taxes? – BP. Aug 13 '09 at 22:46
  • 7
    They mixed up American and Zimbabwe dollars – Macha Aug 13 '09 at 22:47
  • Really? You're gonna bump it because you want to remove the dollar sign (these are dollars we are talking about) and add `0x` to it? – GManNickG Aug 14 '09 at 01:13
  • @GMan - yeah, a bizarre edit by someone! As a Delphi coder, I use "$" for hex naturally. – Roddy Aug 14 '09 at 12:09
  • @Christopher: +1 for hilarity – Kevin Laity Oct 22 '09 at 01:14
  • 11
    I just up-voted this Question, which put the count to 255. Then I clicked to make it a favorite which brought that count to 127. THIS ENTIRE THING IS SPOOKY. – micahwittman Nov 27 '09 at 08:20
  • Scary. I hgad to "favourite" my own question just to get it past the 127 value! – Roddy Nov 27 '09 at 11:19
  • 1
    The new guy made a few fixes to the old COBOL code that everyone is afraid of – John La Rooy Mar 19 '10 at 21:06
  • Whoa, a number 23 in the beginning is indeed magical, I've heard about it in the LOST TV show. – Dan Ganiev Sep 18 '10 at 19:48

7 Answers7

1447

Add the cents to the number and you get 2314885530818450000, which in hexadecimal is 2020 2020 2020 1250.

Do you see the pattern? The first six bytes have been overwritten by spaces (hex 20, dec 32).

Shaihi
  • 3,952
  • 4
  • 27
  • 47
Guffa
  • 687,336
  • 108
  • 737
  • 1,005
239

Hold on a second; there’s something fishy going on.

While the space-padded explanation certainly seems good, it may be (at least partly) specious.

VISA said that there were “fewer than 13,000” customers affected by the snafu with the Visa Buxx pre-paid cards. I’ve found news on several so far. Josh Muszynski in New Hampshire, Jason Bryan in Tennessee, Ron Seale in Texas, Karen Taylor’s teenage son in Bethel, and a teenage girl, Elizabeth Lewis in Owatonna .

The thing is that all of them have the exact same charge: $23,148,855,308,184,500.00. If the problem was the space-padding, then how is it that all of them had the exact same $0x1250 ($46.88) charge? Two of them had purchased cigarettes at gas stations, another two had paid at restaurants, Lewis bought eggs and milk, the last one at a drug store. Do all these varied items happen to cost the same? $46.88 for a restaurant bill seems okay, but for a pack of cigarettes? for milk and eggs‽

The space-padding error makes sense, except it does not account for the 0x1250 constant. Why is it that all of them ended up with 0x2020 2020 2020 1250 instead of 0x2020 2020 2020 2020 or different numbers in the last WORD?

Hmmm, if only 13,000 customers were affected, it may be that somehow that exact, specific charge triggered the error. In that case, it is more than just a field error. If it was just the text field being interpreted as a 64-bit integer, then why didn’t other amounts cause it, thus affecting everyone, not just <13,000. Still, how is it that 13,000 people could have just happened to charge the exact same amount in the same week?

They say it’s a “temporary programming error”, and it may well be, but could it be a hacking thing? In that case, it probably would be a magic-number. In fact, it may be a combination of both: some hacker putting a 0x1250 automatic charge, that got combined with the space-padding error, causing one or both errors to be detected.

The Register thinks that the answer is indeed the padded-field error, but does not expand on why they are all the same, although one of the comments mentions the number possibly being rounded to the nearest $100 (unlikely since banks and banking software explicitly go to lengths to ensure precision).

(There is also a report of a similar, earlier error.)


Jason Bryant’s bill:

Jason Bryant’s bill

Elizabeth Lewis’s bill:

Elizabeth Lewis’s bill

Ron Seale’s bill:

Ron Seale’s bill

Josh Muszynski’s bill:

Josh Muszynski’s bill

Synetech
  • 9,643
  • 9
  • 64
  • 96
  • Another one in salem: http://www.1010wins.com/Visa-Accidentally-Bills-New-York-Teen--23-Quadrill/4867372 – Otto Allmendinger Jul 24 '09 at 16:58
  • That article doesn’t specify the number, but I think it is safe to assume that it is identical to all the others. – Synetech Jul 24 '09 at 18:03
  • 8
    Possibly the number hex 1250 = dec 4688 is the minimum to cause some sort of extra methods of fraud checking. If it is exactly equal to this a bug in the code is introduced? – PeteT Aug 09 '09 at 04:12
  • 6
    +1 can you imagine what would happen if the 13,000 customers did a chargeback at the same time? :P – pageman Aug 09 '09 at 07:43
  • 11
    @petebob796 actually each byte is treated separately, so 1250 (12 50) is 18 and 80. 18 is a control char and 80 is capital P (at least in ASCII). Hmmm... Ctrl+P? – WildJoe Aug 09 '09 at 07:49
  • 1
    $12.50 is a relativly small and round numer. It's not at all surprizing that out of millions of transactions 13,000 had that exact amount. But it does need to be combined with some other logic flaw that triggered the overwrite. – Tom A Aug 23 '09 at 20:35
  • 4
    12.50 is small and round, but it's a completely different number from 0x12.50. And if there's anyone out there paying $12.50 for one pack of cigarettes, I'm glad I quit. –  Nov 22 '09 at 17:22
  • Roger and TomA, it is not $12.50; that is a hexadecimal number. The decimal number (and value) is $46.88; hardly a nice, round number, and certainly not a common value for all those different items purchased (cigarettes, restaurant, milk & eggs). By the way, you think $46.88 (or even $12.50) for cigarettes is bad? try paying that for milk and eggs. – Synetech Nov 25 '11 at 03:16
62

What happens when you make a purchase by card is that the software immediately goes online to ensure you have sufficient funds for the purchase, but only places a hold on the funds for the transaction. At the end of the working day the software then gathers all the transactions placed in the last 24hrs and submits them to the acquiring bank for processing.

The submission to the bank is known as settlement, and its done by sending a plain text file in a very rigid format. (This was all developed decades ago and the number of systems now using it makes it hard to modernise)

Each transaction appears in the file as a line of text, and part of that is the transaction value. This field should be 11 numeric characters (zero padded on the left hand side) and will always hold the value in lowest common denominator (in this case cents). 11 numeric characters caters well for values in any currency.

Looks like the payment processor in this case had made some changes to their submission software and erroneously replaced the zero padding with space padding. Quite how this got by a) service provider, b) acquiring bank and c) Visa without being picked up escapes me. The net value of that settlement file (13,000 high value transactions) would have been astronomical, and maybe that also was a contributing factor somewhere.

PaulG
  • 13,871
  • 9
  • 56
  • 78
  • 15
    "11 numeric characters caters well for values in any currency." -- what about Zimbabwean dollars? – quant_dev Aug 09 '09 at 11:43
  • 6
    Who's paying by VISA in Zimbabwe? (^_^) – ЯegDwight Aug 11 '09 at 01:23
  • That's a good comment. But if it was a software glitch, then there's no proving that a) service provider, b) acquiring bank and c) Visa all saw it at all. It could have arisen at any point. – Isaac Lubow Aug 29 '10 at 04:05
20

If you remove the trailing zero, this validates as a VISA card number. My guess is they swiped the card then manually entered the number, thinking the swipe had failed.

  • 9
    lol - Have we just published his Visa Card number?.. What was his name again? – ian_scho Jul 16 '09 at 15:32
  • 4
    p.s. THIS is the most likely answer, the 200+ upvotes for the first answer are by geeks :) There are around 50+ Billion Visa Transactions a year. – ian_scho Jul 16 '09 at 15:37
  • 14
    No, it was a bug, not a usage error. About 13000 customers were affected by this bug. – Guffa Jul 16 '09 at 15:52
  • 8
    What's the likelihood that the first six bytes would be spaces by sheer chance? – Robert Harvey Jul 16 '09 at 15:56
  • 1
    Unlikely.. there were multiple transactions with different customers, all involving the exact same amount! – Roddy Jul 18 '09 at 11:38
  • John Rasch: Really? I didn't know that! So why do we always have to indicate whether it's Visa, Mastercard, etc. when we're shopping online? – Tyler Aug 09 '09 at 04:12
  • @MatrixFrog: Not always. Some sites do recognize the card just by the number. – Chetan S Aug 09 '09 at 07:23
  • 1
    @MatrixFrog: It's a legacy left over from Visa/Mastercard merchant contracts that require merchants to force the user to identify the card. This was a really bad attempt at improving security by obscurity - making the assumption that it's hard to guess the card issuer if you only had the number. The issuer was verified against the value that user selected. However the lead card number patterns are well known to developers and CC thieves so it's not really "required" any more. – Paul Alexander Aug 13 '09 at 05:59
  • How would you be able to enter such a big price to any payment system? Apparently, databases support $ quadrillion, but not the 4 millionth entry of anything (assuming the ID number is a 32-bit integer). :-p – Constantino Tsarouhas Oct 25 '11 at 20:23
10

The ultimate mystery is still where 12 50 is coming from. They are the ASCII codes for Ctrl+R, P. Which happens to be the secret keystrokes you have to type to enter the validation code for QuickBooks.

Link: Where to enter Validation code

Quite a coincidence. I wonder what happens when you type these keys in the wrong place...

Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
7

If you shift left 64-bit representation 8 bits left (multiply by 256) You will get a well formed credit card number and 3 empty positions for thise 3 secure extra numbers (all zeroes for some reason). There is only 1 out of 10 chance that random number gives a well formed CC number.

5926 1069 5889 5232 000

6

If you use the binary equivelant (1110101110110100) decode of the number 23148855308184500, you get K鑛, which is the Mandarin character for mining and ore. Kmine could mean "knowledge mine," or something like kmine Holdings Ltd. Perhaps there's a correlation between K(mine or ore) and Bank of America or Visa?

  • 56
    I think everything is much more deeper that this. If you multiply this number by the height of Pyramid of Khufu and then multiply every third number by 2012 you will get exactly 1/666 length to the Alpha Centauri. – serg Jul 17 '09 at 15:15