pankkijuttu

April 14, 2015

Summary in English: A Finnish online bank included a third-party web analytics script in all of its pages. The bank reassured customers that no identifiable information is sent to the third party. However, the analytics script slurps the full URL the user is browsing. This includes, for instance, an unsalted SHA1 hash of the user's bank account number, which can be reversed in seconds. The script has since been removed from the site.

The blog post about this: absorptions: Trackers leaking bank account data.


Tästä verkkopankkijutusta vielä.

Mitähän kolmannelle osapuolelle oikein lähteekään? Tässä tuo analytiikkapyyntö demotunnuksella:

Remote Address: 80.***.***.***:443
Request URL: https://www.******-analytics.com/collect?v=1&_v=j33&a=870588619&t
=pageview&_s=1&dl=https%3A%2F%2Fonline.********.fi%2Febank%2Faccount%2FinitTra
nsactionDetails.do%3FbackLink%3Dreset%26accountId%3D69af881eca98b7042f18e975e0
0f9d49d5d5ee64%26rowNo%3D0%26type%3Dtrans%26archivecode%3D20150220123456780002
&ul=en-us&de=windows-1252&dt=Tilit%C2%A0%7C%C2%A0Verkkopankki%20%7C%20S-Pankki
&sd=24-bit&sr=1440x900&vp=1440x150&je=1&fl=16.0%20r0&_u=QACAAQQBI~&jid=&cid=18
39557247.1424801770&uid=&tid=UA-37407484-1&cd1=&cd2=demo_accounts&cd3=%2Ffi%2F
&z=2098846672
Request Method: GET
Status Code: 200 OK

Tässä käyttämäni demotunnukset:

Maija Meikäläisen tili

Käyttäjän selain tekee ylläolevan pyynnön kolmannen osapuolen palvelimelle aina, kun tilisiirron tarkastelusivu avataan. Mukana on jonkinlainen tiiviste nimeltään "accountId"; pituutensa puolesta voisi olla SHA1. Tämä on merkitty tuossa punaisella.

Voisiko tämä olla ihan vain SHA1-tiiviste tilinumerosta (englanniksi account ID)? Ei kai nyt sentään. Silloinhan tiivisteen voisi helposti palauttaa alkuperäiseen tilinumeroon kokeilemalla kaikki vaihtoehdot läpi. Koska tilinumerot noudattavat aina samaa kaavaa ja niitä on melko vähän erilaisia, varsinkin jos pankki on jo tiedossa, ei tässä menisi edes kauan.

Tarkalleen ottaen 0,5 sekuntia:

Vastaus: 39390001000603
./tilinro  0.47s user 0.00s system 98% cpu 0.475 total

On siis löydettävissä numerosarja (39390001000603), joka vastaa käyttäjän tilinumeroa (FI96 3939 0001 0006 03) ilman maatunnusta ja tarkistussummaa. Pyynnön mukana siis siirtyy kolmannelle osapuolelle merkkisarja, josta käy ilmi verkkopankin käyttäjän tilinumero.

Käyttämäni C-koodi:

#include <openssl/sha.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
  const char target[SHA_DIGEST_LENGTH] = {
    0x69, 0xaf, 0x88, 0x1e, 0xca, 0x98, 0xb7, 0x04, 0x2f, 0x18,
    0xe9, 0x75, 0xe0, 0x0f, 0x9d, 0x49, 0xd5, 0xd5, 0xee, 0x64
  };
  unsigned char test_str[15];
  unsigned char test_hash[SHA_DIGEST_LENGTH];

  for (int k=0; k < 9999; k++) {
    for (int tili=0; tili <= 999999; tili++) {
      snprintf(test_str, 15, "3939%04d%06d", k, tili);
      SHA1(test_str, 14, test_hash);
      if (memcmp(test_hash, target, 20) == 0) {
        printf("Vastaus: %s\n", test_str);
        exit(0);
      }
    }
  }
}

Kiitos inspiraatiosta kuuluu ospille.


terkuin: oona