Door Anoniem: Je zou MD5 én SHA1 hashes kunnen controleren, samen met de bestandsgrootte. (aantal bytes)
Ja, als die informatie allemaal (door een betrouwbare bron) gepubliceerd wordt. Ik zie echter zelden zowel MD5 als SHA1 genoemd worden, en in de situaties
dat dit gebeurt, staat SHA256 er meestal ook bij. Waarom moeilijk doen dan?
Door Anoniem: Wat ik trouwens niet helemaal zeker weet, is of die redirect 307 ook met https werkt.
Ik denk van wel, want bijv. de whatsapp website heeft https. Wat denk jij?
Kort antwoord: nee.
Lang antwoord:
Bij het correct opzetten van een https verbinding met, bijvoorbeeld, www.example.com gebeurt ongeveer het volgende:
1) Ervan uitgaande dat jouw PC (of willekeurig welk device aan jouw netwerk) via DHCP een IP adres krijgt, krijgt jouw PC ook via DHCP het IP-adres van jouw lokale router en van 1 of meer DNS servers meegedeeld. Die informatie kan worden vervalst, bijv. als jouw router gehacked is of er zich een ander kwaadaardig device aan jouw lokale netwerk is gekoppeld. Als alles goed gaat krijg je correcte gegevens, en als DNS server(s) jouw eigen router en/of DNS server(s) van jouw ISP. Die instelling kun je natuurlijk overrulen met bijv. 8.8.8.8, maar UDP verkeer met die server verloopt onversleuteld via jouw ISP en kan dus eenvoudig gemanipuleerd worden;
2) Op jouw lokale netwerk zou zich een kwaadaardig device kunnen bevinden dat netwerkverkeer tussen jouw device en router probeert te kapen, bijv. middels ARP attacks, ICMP redirects en/of ICMP Router Advertisement Messages. Ook kan zij eventuele WPAD requests vanuit jouw PC met valse gegevens beantwoorden, waardoor jouw PC denkt dat deze voor http en https van een proxy server gebruik moet maken;
3) Ervan uitgaande dat de client (bijv. webbrowser) op jouw netwerk geen gebruik maakt van een proxy (ingesteld via bijv. WPAD) zal deze een DNS lookup van www.example.com en een IP-adres terugkrijgen, bijv. 192.0.2.1. Dat kan het echte IP adres van www.example.com zijn, maar het kan ook vervalst zijn (bijv. door de ISP of bijv. door een aanvaller die onrechtmatig schrijftoegang heeft gekregen tot de authoritative DNS server voor www.example.com);
4) Ervan uitgaande dat het geretourneerde IP-adres zich niet in jouw lokale subnet bevindt, zal jouw PC via ARP, dus op basis van het IP-adres van jouw router, om het Ethernet-adres van jouw router vragen. Een kwaadaardig device aan jouw netwerk kan dan zijn Ethernetadres retourneren waarna jouw PC denkt dat het kwaadaardige device jouw router is en daarmee gaat communiceren;
5) Ervan uitgaande dat er geen kwaadaardig device aan jouw netwerk hangt, zal jouw PC ethernetpakketjes uitwisselen met jouw router, met het verzoek verbinding te maken met IP-adres 192.0.2.1. Dat gaat daarna via jouw ISP en allerlei netwerkproviders "onderweg", die jouw IP pakketjes naar elke door hen gewenste server kunnen routeren;
6) Ervan uitgaande dat alle ISP's onderweg betrouwbaar zijn, zou IP-adres 192.0.2.1 best van een CDN (Content Delivery Network) provider kunnen zijn. De praktijk is dan dat 1 of meer server(s) van die CDN provider het https (TLS) endpoint vormen en je geen idee hebt of en hoe met servers van de bedoelde organisatie wordt gecommuniceerd;
7) Ervan uitgaande dat geen sprake is van een CDN en 192.0.2.1 "up" is, zal jouw client een TLS handshake beginnen met IP-adres 192.0.2.1. Moderne clients geven daarbij vaak aan dat ze feitelijk een verbinding willen met www.example.com (zodat er meerdere https servers op 1 IP-adres kunnen draaien), maar noodzakelijk is dit niet. In grote lijnen (vereenvoudigd en mogelijk is de volgorde niet precies zo) bestaat die handhake uit de volgende stappen:
8) De webserver stuurt haar certificaat naar jouw client (meestal samen met alle benodigde intermediate certificaten);
9) De client checkt of de domainname waar verbinding mee gezocht is (www.example.com) overeenkomt met een van de diomainnames genoemd in het certificaat onder "Subject Alternate Names". Als dat niet het geval is, wordt een certificaatfoutmelding gegeven, en stopt de communicatie;
10) De client checkt ook of het certificaat niet verlopen is en, via een keten aan eventuele intermediate certificaten tot en met een root certificaat dat in het besturingssysteem (of de client zelf), wordt vertrouwd; zo niet dan volgt een certificaatwaarschuwing. De client checkt meestal ook of geen van de betrokken certificaten is ingetrokken. Gebruikelijk hierbij is dat, als antwoorden hierop te lang uitblijven, de client er gemakshalve vanuit gaat dat het wel goed zit hiermee;
11) De client en de server wisselen informatie uit over welke symmetrische versleutelingsprotocollen zij ondersteunen, waarna de beste gemeenschappelijke wordt gekozen, bijv. AES128;
12) Jouw client en de server voeren een Diffie-Hellman key agreement uit, waarbij beide partijen (via een nog niet versleutelde en server-geauthenticeerde verbinding) een onvoorspelbare symmetrische sleutel voor symmetrische encryptie overeenkomen -
zonder dat die sleutel zelf wordt uitgewisseld (dat is de charme van DH). Let op: jouw client heeft nog geen enkele zekerheid over de identiteit van de server waar die sleutel mee is overeengekomen, dat zou best een MitM (Man in the Middle) aanvaller kunnen zijn die zich via 1 van bovenstaande aanvallen
voordoet als de server. Vanaf dit moment wordt alle uitgewisselde informatie versleuteld;
Correctie 26-09-2017 22:20, bij de tegenwoordig gebruikelijke DHE_RSA key agreement vindt authenticatie van de server op een andere manier plaats dan ik eerder schreef achter de punten 13 en 14 (ik laat de oude tekst in onderstaande box staan):
13) Ervan uitgaande dat alles nog steeds in orde is, genereert de client een willekeurig (random) getal, versleutelt dat met de public key uit het servercertificaat en stuurt het resultaat naar de server. UITSLUITEND een server die over de private key, behorende bij de public key in het servercertificaat beschikt, kan het versleutelde getal correct ontsleutelen en zal dit terugsturen;
14) Als de client ziet dat het teruggestuurde getal overeenkomt met het eerder zelf gegenereerde getal, weet de client zeker dat de server over de private key, behorende bij de public key in het certificaat, beschikt. Ervan uitgaande dat de private key niet in verkeerde handen is gevallen, weet je zeker dat de server over de private key beschikt die hoort bij de public key in het certificaat;
13) (gecorrigeerd) Eerder, aan het begin van de handshake, heeft de client een random nummer gegenereerd en naar de server gestuurd (stap 7) en de server heeft ook een random nummer gegenereerd en dat in stap 8 naar de client gestuurd. De server genereert nu een digitale handtekening over een mix van beide random nummers en de door de server gegenereerde Diffie-Hellman parameters genoemd in stap 12, door over die mix een SHA256 hash te berekenen en die te versleutelen met de private key (behorende bij de public key in het certificaat), en stuurt ook deze "handtekening" naar de client;
14) (gecorrigeerd) De client berekent, op exact dezelfde wijze als de server in stap 13, de SHA256 hash over de mix van de uitgewisselde random nummers en de door de server opgestuurde Diffie-Hellman parameters. Ook ontsleutelt de client de signature uit stap 13 met de public key uit het servercertificaat, wat uitsluitend dezelfde SHA256 waarde kan opleveren als de server over de private key beschikt, behorende bij de public key in het certificaat. Daarmee is de identiteit van de server aangetoond en weet de client zeker dat er met een server wordt gecommuniceerd waarvan de domainname voorkomt in het certificaat (einde correctie);
15) Pas
hierna wordt http informatie (HTML, CSS, Javascript maar ook evt. redirects) via de (versleutelde en server-geauthenticeerde) TLS verbinding uitgewisseld.
Aanvulling 26-09-2017, 22:20: stap 7 t/m 15 worden goed en veel uitgebreider toegelicht in
https://tlseminar.github.io/first-few-milliseconds/. Ter verduidelijking, onderaan de paragraaf die begint met
ServerKeyExchange in die webpagina staat:
The server will choose a random private key and compute $a*G$ as its
public key. In addition to this it also signs the data with
its private key - signing
SHA256(client_random + server_random + server_params)
Met
its private key wordt niet de net daarvoor genoemde random (DH) private key bedoeld, maar de vaste RSA private key behorende bij de public key in het servercertificaat. Die RSA private key wordt gebruikt voor signing in stap 13. (Einde aanvulling).
De kracht van https is dat verschillende soorten (met name MitM) aanvallen uitgesloten kunnen worden als je geen certificaatwaarschuwing krijgt. Daarmee beschermt https jou tegen ARP, DNS, routering en MitM aanvallen.
De overblijvende risico's zijn hoofdzakelijk:
A) Onbetrouwbare software op jouw PC;
B) Dat je niet de exacte domeinnaam kent (of je laat foppen) van de organisatie waar je verbinding mee wilt maken;
C) Dat een (door jouw OS of client vertrouwde) certificaatverstrekker een servercertificaat (of intermediate certificaat) voor de bedoelde domeinnaam heeft afgegeven aan een kwaadwillende derde (of zelf is gehacked), door niet op betrouwbare wijze vast te stellen dat die aanvrager geautoriseerd is om een certificaat voor die domeinnaam aan te vragen;
D) Het in verkeerde handen vallen van private keys. Dit probleem is veel groter dan vaak gedacht omdat steeds meer CDN's worden ingezet met endpoints bij lokale ISP's;
E) Zwakke cryptografie;
F) Niet of niet tijdig geïnformeerd worden dat een certificaat is ingetrokken.
Het fraaie van https is dat alle aanvallen van het type MitM, DNS, IP routering, lokale ARP en proxy, maar ook op niveau van http redirect onmogelijk zijn, maar helaas blijven bovenstaande risico's wel bestaan.
Ook is het -helaas- zo, dat als jouw OS of client certificaatleveranciers vertrouwt die DV certificaten verstrekken, veel van die afhankelijkheden weer worden geïntroduceerd - d.w.z. op het moment dat de certificaatverstrekker controleert of een aanvrager van een certificaat geautoriseerd is om dat te doen voor een specifieke domeinnaam.
Elke ISP die een MitM aanval (hoeft maar heel even te duren) tussen een server en een DV certificaatverstrekker (zoals Let's Encrypt) kan uitvoeren, kan een geldig certificaat verkrijgen voor die server. Kansloos voor Russen met een server en letsencrypt in de USA zul je zeggen. Maar er zijn wel regelmatig BGP hijacks die nauwelijks aan configuratiefouten kunnen worden toegeschreven, zoals afgelopen april toen de Russische ISP RosTelecom claimde dat IP verkeer naar "MasterCard,Visa, Fortis,Alfa-Bank,card complete Service Bank and more" (bron: [1]) naar haar netwerk moest worden gerouteerd.
[1]
https://bgpmon.net/bgpstream-and-the-curious-case-of-as12389/Door Anoniem: De aanval is me ook niet helemaal duidelijk hoe deze nu precies werkt.
Wordt de browser nu geïnformeerd over de 307 redirect of niet?
In een https verbinding kan een MitM aanvaller geen redirectverzoek injecteren
tenzij die aanvaller over een certificaat beschikt dat jouw browser accepteert voor de betreffende server.
Veel feitelijke downloads gebeuren echter nog steeds via http (of soms ftp). En hoewel veel binaries gesigneerd zijn, is het een koud kunstje om die signature te verwijderen of te vervangen door een andere (met een naam die lijkt op de oorspronkelijke ondertekenaar).
Het is dus zaak dat http wordt vervangen door https en dat we ons realiseren dat CDN's een groot risico kunnen vormen, en dat https met een DV certificaat nauwelijks meerwaarde biedt boven http.