Detekcia aktívnej VPN v sandboxovanej aplikácii pre Mac
Na túto otázku neexistuje verejné API a trik s názvom rozhrania je len heuristika. Šesť kontrol, podľa ktorých sa rozhodnete, na čom má vaša aplikácia skutočne závisieť.
Potrebujete, aby sa jedna obrazovka správala inak, keď je tunel aktívny, a neexistuje volanie, ktoré by vám to povedalo. To je obmedzenie pri vydaní: v macOS žiadny verejný rámec nehlási, či je pripojená ľubovoľná VPN, a v iOS patrí stav aplikácii, ktorá konfiguráciu nainštalovala. Nasledujúce kontroly vedú od tohto limitu k niečomu, čo môžete vydať, a ktorákoľvek z nich môže hľadanie ukončiť skôr.
Kontrola 1: dá sa na otázku vôbec odpovedať?
Sandbox rieši otázku skôr než akékoľvek API. Proces tretej strany nemôže vymenovať rozšírenie iného dodávateľa a nemôže prečítať ani konfiguráciu tohto rozšírenia, takže neexistuje podporovaný objekt, na ktorý sa opýtať.
Každé obídenie narazí na rovnakú stenu. Výpisy rozhraní, scutil --nc list a priame čítania systémovej konfigurácie buď vyžadujú oprávnenia, ktoré sandbox zadržiava, alebo závisia od správania, ktoré Apple nikdy nesľúbil. Ak plán potrebuje jedno z toho, problém je v pláne. Funkcia postavená na nedokumentovanom detaile je tiket podpory s dátumom dodania.
Kontrola 2: spravuje vaša aplikácia tunel sama?
Ak áno, máte podporovanú odpoveď pre vlastnú konfiguráciu. Načítajte predvoľby, ošetrite chybu, potom prečítajte stav a prihláste sa na odber zmien namiesto dotazovania:
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
}Buďte presní v tom, čo to vracia: stav tunela, ktorý ste nainštalovali. Používateľ s iným klientom sa zobrazí ako nepripojený a to nie je chyba vo vašom kóde. Rozhodnite, ktorú z týchto dvoch otázok vaša funkcia skutočne kladie, skôr než na odpovedi postavíte čokoľvek ďalšie.
Kontrola 3: čo by vám heuristika vlastne povedala?
Široko kopírovaný prístup sa pýta systémového slovníka proxy na jeho obmedzené položky a číta kľúče, ktoré sú náhodou názvy rozhraní:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Kľúč začínajúci na tap, tun, ppp, ipsec alebo utun znamená, že je prítomné rozhranie s rozsahom tunela. Porovnávanie celého názvu zlyhá okamžite, pretože iOS 12 prišiel s utun1 a utun2 a niektoré profily sa zobrazujú ako ipsec4, ppp0 alebo utun0. Porovnávajte radšej prefixy.
Napriek tomu názov neidentifikuje žiadneho vlastníka. Systémové funkcie a rozšírenia iných dodávateľov tiež vytvárajú rozhrania utun a nejaké môže existovať bez toho, aby nieslo akúkoľvek vašu prevádzku. Čítajte to ako náznak, že v okolí je niečo v tvare tunela, nič silnejšie. Falošný pozitív je tu lacný, ak obmedzujete len jednu funkciu, a drahý, ak obmedzujete prihlasovaciu obrazovku.
Kontrola 4: môžete namiesto toho otestovať cieľ?
Ak aplikácia potrebuje len vedieť, či je dostupná interná služba, otestujte tú službu. Krátka sonda s časovým limitom odpovedá na otázku, na ktorej funkcia skutočne závisí, a funguje ďalej, keď používateľ zmení klienta alebo tunel zmení tvar.
Dostupnosť je pozorovanie o vašej ceste. Názov rozhrania je odvodenie o niečom, čo susedí s vašou cestou, a preto heuristika produkuje hádky v hláseniach chýb, zatiaľ čo sonda produkuje dôkazy. Ak sonda zlyhá, zatiaľ čo používateľ trvá na tom, že VPN je zapnutá, máte teraz konkrétnu cestu na ladenie: preklad názvov, trasu alebo oprávnenie služby.
Kontrola 5: môže platforma vynútiť to, čo potrebujete?
Keď je požiadavkou záruka, že nič neunikne z tunela, profil je miesto, kam patrí, nie detektor. Zapnutie includeAllNetworks v konfigurácii plného tunela na iOS 14 alebo novšom mení správanie platformy namiesto toho, aby vaša aplikácia niečo odvodzovala. Príznak je zdokumentovaný v referencii NEVPNProtocol.
To je iný druh odpovede: vynútenie namiesto pozorovania. Platí tiež len pre profily, ktoré ovládate, takže nepomôže spotrebiteľskej aplikácii, ktorá sleduje cudzí tunel.
Kontrola 6: urobte zlyhanie bezpečným a pozorovateľným
Vypnite len tú schopnosť, ktorá potrebuje tunel, a zvyšok aplikácie nechajte použiteľný. Detektor, ktorý pri každej neistote skryje celé rozhranie, vyrába výpadok pre každého, ktorého tunel používa názov, ktorý ste nikdy nepredpokladali. Vráťte sa namiesto toho ku konzervatívnemu správaniu: lokálne funkcie fungujú ďalej a zakázané je len to vzdialené volanie, ktoré tunel skutočne potrebuje. Táto voľba je produktové rozhodnutie a zaslúži si byť zapísaná vedľa heuristiky.
Zaznamenajte, čo ste pozorovali: názvy rozhraní, verziu platformy a výsledok jednej sondy. To premení nasledujúce hlásenie z hádky na kontrolu. Potom uprednostnite podporované vyhlásenie, kde ho máte, pretože spravovaná konfigurácia môže niesť zámer výslovne a odstrániť väčšinu dôvodu názvy vôbec skúmať.
Ak vás kontroly 1 až 5 nechali bez podporovanej odpovede, vyšlite sondu a výsledok pomenujte čestne. Zdokumentovaný signál najlepšej snahy je lepšie produktové rozhodnutie než súkromné API, ktoré sa v ďalšom vydaní pokazí.