Otkrivanje aktivnog VPN-a u sandbox Mac aplikaciji
Za ovo pitanje ne postoji javni API, a trik s imenom interfejsa je samo heuristika. Šest provjera da odlučite na šta vaša aplikacija zaista treba da se osloni.
Potreban vam je jedan ekran koji se ponaša drugačije kada je tunel aktivan, a nema poziva koji vam to kaže. To je ograničenje pri isporuci: na macOS-u nijedan javni okvir ne izvještava da li je proizvoljan VPN povezan, a na iOS-u status pripada aplikaciji koja je instalirala konfiguraciju. Provjere ispod vode od te granice do nečega što možete isporučiti, i svaka od njih može rano završiti pretragu.
Provjera 1: može li se na pitanje uopšte odgovoriti?
Sandbox rješava pitanje prije bilo kojeg API-ja. Proces treće strane ne može nabrojati ekstenziju drugog dobavljača, niti može pročitati konfiguraciju te ekstenzije, pa nema podržanog objekta koji se može pitati.
Svaki zaobilazni put udara u isti zid. Liste interfejsa, scutil --nc list i direktna čitanja sistemske konfiguracije ili zahtijevaju ovlaštenja koja sandbox uskraćuje ili zavise od ponašanja koje Apple nikada nije obećao. Ako planu treba nešto od toga, problem je u planu. Funkcija izgrađena na nedokumentovanom detalju je zahtjev za podršku s datumom isporuke.
Provjera 2: upravlja li vaša aplikacija tunelom sama?
Ako upravlja, imate podržan odgovor za vlastitu konfiguraciju. Učitajte postavke, obradite grešku, zatim pročitajte status i pretplatite se na promjene umjesto anketiranja:
vpnManager.loadFromPreferences { error in
// handle a load failure before reading status
}
NotificationCenter.default.addObserver(
forName: .NEVPNStatusDidChange,
object: nil,
queue: nil
) { note in
let status = (note.object as? NEVPNConnection)?.status
}Budite precizni oko toga šta ovo vraća: stanje tunela koji ste instalirali. Korisnik koji pokreće drugi klijent bit će prikazan kao nepovezan, i to nije greška u vašem kodu. Odlučite koje od ta dva pitanja vaša funkcija zaista postavlja prije nego što gradite na odgovoru.
Provjera 3: šta bi vam heuristika zapravo rekla?
Široko kopiran pristup pita sistemski rječnik proxyja za njegove obuhvaćene unose i čita ključeve, koji su slučajno imena interfejsa:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Ključ koji počinje sa tap, tun, ppp, ipsec ili utun implicira da je prisutan interfejs obuhvaćen tunelom. Podudaranje cijelog imena odmah pada, jer je iOS 12 isporučen s utun1 i utun2, a neki profili se pojavljuju kao ipsec4, ppp0 ili utun0. Umjesto toga uporedite prefikse.
Ipak, ime ne identificira vlasnika. Sistemske funkcije i ekstenzije drugih dobavljača također stvaraju utun interfejse, a jedan može postojati dok ne nosi ništa od vašeg saobraćaja. Čitajte to kao nagovještaj da je u blizini nešto u obliku tunela, ništa više. Lažno pozitivan rezultat ovdje je jeftin ako ograničavate samo jednu funkciju, a skup ako ograničavate ekran za prijavu.
Provjera 4: možete li umjesto toga testirati odredište?
Ako aplikacija samo treba znati je li interna usluga dostupna, testirajte tu uslugu. Kratka sonda s vremenskim ograničenjem odgovara na pitanje o kojem funkcija zaista zavisi, i nastavlja raditi kada korisnik promijeni klijenta ili tunel promijeni oblik.
Dostupnost je zapažanje o vašoj putanji. Ime interfejsa je zaključak o nečemu što graniči s vašom putanjom, zato heuristika stvara rasprave u izvještajima o greškama, a sonda stvara dokaze. Ako sonda ne uspije dok korisnik tvrdi da je VPN uključen, sada imate konkretnu putanju za otklanjanje greške: razrješavanje imena, rutu ili dozvolu usluge.
Provjera 5: može li platforma nametnuti ono što vam treba?
Kada je zahtjev garancija da ništa ne izlazi iz tunela, profil je pravo mjesto za to, a ne detektor. Uključivanje includeAllNetworks u konfiguraciji punog tunela na iOS 14 ili novijem mijenja ponašanje platforme umjesto da traži od vaše aplikacije da to zaključi. Zastavica je dokumentovana u referenci NEVPNProtocol.
To je druga vrsta odgovora: nametanje umjesto posmatranja. Također se primjenjuje samo na profile koje kontrolišete, pa ne pomaže potrošačkoj aplikaciji koja gleda tuđi tunel.
Provjera 6: učinite neuspjeh sigurnim i vidljivim
Isključite samo sposobnost kojoj treba tunel i ostavite ostatak aplikacije upotrebljivim. Detektor koji sakrije cijelo sučelje kad god nije siguran stvara prekid rada za svakoga čiji tunel koristi ime koje nikada niste predvidjeli. Umjesto toga vratite se na konzervativno ponašanje: lokalne funkcije nastavljaju raditi i onemogućen je samo udaljeni poziv kojem tunel zaista treba. Taj izbor je odluka o proizvodu i zaslužuje da bude zapisan pored heuristike.
Zabilježite šta ste primijetili: imena interfejsa, verziju platforme i rezultat jedne sonde. To sljedeći izvještaj pretvara iz rasprave u provjeru. Zatim dajte prednost podržanoj deklaraciji gdje je imate, jer upravljana konfiguracija može eksplicitno nositi namjeru i ukloniti većinu razloga za provjeru imena uopšte.
Ako su vas provjere od 1 do 5 ostavile bez podržanog odgovora, isporučite sondu i iskreno označite rezultat. Dokumentovan signal najboljeg napora bolja je odluka o proizvodu od privatnog API-ja koji se kvari u sljedećem izdanju.