Vulnerabilitate Instagram: postări private expuse fără autentificare
Platformă afectată: Instagram Expunerea postărilor private pe Instagram prin polaris_timeline_connection Analiză tehnică completă a unei vulnerabilități server-side negate oficial…
Expunerea postărilor private pe Instagram prin polaris_timeline_connection
Analiză tehnică completă a unei vulnerabilități server-side negate oficial
Platformă afectată: Instagram
Deținut de: Meta
Perioada descoperirii: Octombrie 2025
Durata disclosure-ului: 102 zile
Tip vulnerabilitate: Server-side authorization bypass
Impact: Acces neautorizat la conținut privat (imagini + descrieri)
Status final: Patch aplicat în tăcere, caz închis ca Not Applicable
1. Introducere
Acest articol documentează o vulnerabilitate reală, exploatabilă și demonstrată din infrastructura Instagram (mobile web), care a permis acces complet neautentificat la postări aparținând unor conturi setate ca private.
Deși problema a fost corectată în mod demonstrabil la scurt timp după raportare, Meta a refuzat recunoașterea existenței ei, susținând că nu a fost niciodată reproductibilă.
Articolul de față nu este o opinie, ci o reconstrucție tehnică și cronologică, bazată pe:
-
dovezi video cu hash criptografic,
-
scripturi PoC,
-
loguri de rețea,
-
commit-uri Git timestamp-ate,
-
corespondență oficială Meta.
2. Contextul descoperirii
Vulnerabilitatea a fost descoperită accidental, în timpul dezvoltării unui workflow automation tool pentru cereri HTTP.
Analizând răspunsuri HTML returnate de Instagram mobile web, am observat un comportament neobișnuit:
-
conținut media era returnat în HTML,
-
deși cererea era complet neautentificată,
-
iar profilul țintă era setat explicit ca private.
Inițial, ipotezele luate în calcul au fost:
-
cache CDN defectuos,
-
bleed de sesiune,
-
eroare locală de testare.
Toate au fost eliminate prin testare repetată și controlată.
3. Confirmarea vulnerabilității
Pentru a exclude orice posibilitate de eroare, testarea a fost repetată pe propriul meu cont privat:
-
Contul a fost setat private
-
A fost publicată o postare nouă
-
S-a așteptat propagarea normală
-
S-a trimis o cerere GET fără login, cookie, token sau sesiune
Rezultatul:
-
postarea privată era prezentă în răspuns,
-
imaginea se putea accesa direct din CDN,
-
descrierea (caption) era inclusă.
Acest pas este esențial: nu exista niciun vector de atac „extern”.
Serverul Instagram genera date private pentru utilizatori neautentificați.
4. Descriere tehnică detaliată
4.1 Endpoint-ul
Cererea:
-
nu include cookie-uri
-
nu include token-uri
-
nu include headere de autentificare
Singura condiție era utilizarea unor headere specifice mobile (User-Agent / Accept).
4.2 Răspunsul serverului
Serverul returna HTML care conținea JSON embeduit.
În structura acestui JSON apărea obiectul:
Cu următoarea structură relevantă:
4.3 De ce este critic
-
edges[] nu ar trebui populat pentru conturi private
-
popularea lui implică verificări de autorizare server-side
-
CDN-ul servește conținut valid, pentru că backend-ul l-a expus
Nu este un bug de frontend.
Nu este un bug de cache.
Este o eroare logică de autorizare în backend.
5. Proof of Concept (PoC)
A fost creat un script Python care:
-
Trimite cererea neautentificată
-
Extrage JSON-ul embeduit
-
Parcurge polaris_timeline_connection.edges
-
Obține display_url
-
Accesează direct conținutul privat din CDN
Scriptul a fost:
-
rulat local
-
filmat
-
folosit pe conturi terțe doar cu acord explicit
6. Testare controlată
Testarea oficială a fost limitată strict la conturi cu permisiune.
Rezultate:
-
Total conturi testate: 7
-
Conturi vulnerabile: 2 (~28%)
-
Conturi neafectate: 5
Observații:
-
vulnerabilitatea era condițională
-
nu afecta toate conturile private
-
primele indicii sugerau o corelație cu vechimea contului
-
cauza exactă nu a fost determinată
Această natură condițională crește severitatea problemei, deoarece:
-
este greu de detectat,
-
este greu de confirmat ca rezolvată,
-
este ușor de negat.
7. Disclosure către Meta – cronologie completă
12 octombrie 2025
-
Raport inițial trimis către Meta Bug Bounty
-
Includea:
-
explicație tehnică
-
script PoC
-
demonstrație video
-
Răspuns Meta:
Caz închis ca „CDN caching issue”.
13–15 octombrie 2025
-
Raport nou, reformulat explicit ca server-side authorization bypass
-
Meta începe dialogul
Acțiuni:
-
Meta solicită test pe contul lor → nu vulnerabil
-
Meta solicită cont vulnerabil → furnizat cu acord
-
Vulnerabilitatea este demonstrată din nou
-
Sunt trimise:
-
video-uri
-
script
-
explicație a stării „trigger”
-
16 octombrie 2025
-
Vulnerabilitatea nu mai funcționează
-
Toate conturile anterior afectate returnează edges: []
Nu există:
-
notificare
-
confirmare
-
explicație
27 octombrie 2025
Meta răspunde oficial:
„We are unable to reproduce this issue.”
Cazul este închis ca Not Applicable.
8. Starea „trigger” – indiciu critic
În timpul exploatării, un indicator consistent era:
-
cont privat afișat cu 0 followers / 0 following
-
story ring prezent
-
timeline populat cu date reale
Această inconsecvență indică:
-
un state intern corupt
-
un flux de execuție unde verificările de autorizare sunt sărite
9. Ce NU a făcut Meta
-
Nu a cerut loguri de debug Au fost oferite explicit (X-FB-Debug headers). Ignorate.
-
Nu a analizat natura condițională Lista comparativă de conturi afectate a fost ignorată.
-
Nu există Root Cause Analysis „Infrastructure changes” ≠ analiză de securitate.
Fără RCA, nu există garanția că:
-
problema nu reapare,
-
aceeași clasă de bug nu există în altă parte.
10. Dovezi și integritate
Au fost arhivate și versionate:
-
script PoC
-
capturi before / after
-
4 video-uri cu timestamp + SHA256
-
arhivă completă de comunicare Meta
-
loguri de rețea
-
istoric Git public
Dovezile nu pot fi fabricate retroactiv.
11. Impact real
Instagram deservește peste 1 miliard de utilizatori.
Un bug care:
-
afectează doar unele conturi private,
-
nu lasă urme vizibile,
-
nu notifică utilizatorii,
este extrem de periculos.
Utilizatorii se bazează pe faptul că private înseamnă private.
12. De ce acest disclosure este public
-
standardul industriei: 90 zile
-
Meta a avut 102 zile
-
exploit-ul nu mai funcționează
-
nu a existat recunoaștere sau transparență
Scopul acestui articol:
-
documentare istorică
-
verificare independentă
-
responsabilitate publică
13. Concluzie
Întrebarea reală nu este:
„Mai funcționează azi?”
Ci:
Au fost expuse date private utilizatorilor neautorizați?
Pe baza dovezilor tehnice, cronologice și criptografice:
da, au fost.
Technical Details
For those who want to dig deeper:
-
Github& README — Overview and evidence links
-
TIMELINE.md with videos, images— Complete chronological record
-
**poc.py **— Proof-of-concept script
-
**official_communication/ **— Full Meta correspondence (PDF)
Before
After
Material editorial ZebraByte despre securitate digitală, infrastructură, privacy și conformitate, păstrat în arhiva tehnică a companiei.