Actualizare dinamică a software-ului - Dynamic software updating
În informatică , actualizarea dinamică a software-ului ( DSU ) este un domeniu de cercetare referitor la actualizarea programelor în timp ce rulează. DSU nu este utilizat în prezent pe scară largă în industrie. Cu toate acestea, cercetătorii au dezvoltat o mare varietate de sisteme și tehnici pentru implementarea DSU. Aceste sisteme sunt testate în mod obișnuit pe programe din lumea reală.
Sistemele de operare actuale și limbajele de programare nu sunt de obicei concepute având în vedere DSU. Ca atare, implementările DSU folosesc de obicei fie instrumente existente, fie implementează compilatoare de specialitate . Aceste compilatoare păstrează semantica programului original, dar instrumentează fie codul sursă, fie codul obiectului pentru a produce un program actualizabil dinamic. Cercetătorii compară variantele de programe compatibile DSU cu programul original pentru a evalua siguranța și performanța generală.
Introducere
Orice program care rulează poate fi gândit la un tuplu , unde este starea curentă a programului și este codul curent al programului. Sistemele dinamice de actualizare a software-ului transformă un program care rulează într-o nouă versiune . Pentru a face acest lucru, statul trebuie transformat în reprezentarea așteptată. Acest lucru necesită o funcție de transformare de stare . Astfel, DSU transformă un program în . O actualizare este considerată valabilă dacă și numai dacă programul care rulează poate fi redus la un tupl punct care este accesibil din punctul de plecare al noii versiuni a programului ,.
Locația dintr-un program în care are loc o actualizare dinamică este denumită punct de actualizare . Implementările DSU existente variază foarte mult în tratarea punctelor de actualizare. În unele sisteme, cum ar fi UpStare și PoLUS , o actualizare poate avea loc în orice moment în timpul execuției. Compilatorul Ginseng va încerca să deducă locații bune pentru punctele de actualizare, dar poate folosi și puncte de actualizare specificate de programator. Kitsune și Ekiden solicită dezvoltatorilor să specifice manual și să denumească toate punctele de actualizare.
Sistemele de actualizare diferă în ceea ce privește tipurile de modificări ale programului pe care le acceptă. De exemplu, Ksplice acceptă doar modificări de cod în funcții și nu acceptă modificări ale reprezentării stării. Acest lucru se datorează faptului că Ksplice vizează în principal modificările de securitate, mai degrabă decât actualizările generale. În schimb, Ekiden poate actualiza un program la orice alt program capabil de a fi executat, chiar și unul scris într-un limbaj de programare diferit. Proiectanții de sisteme pot extrage asigurări valoroase de performanță sau siguranță prin limitarea sferei actualizărilor. De exemplu, orice verificare de siguranță a actualizărilor limitează sfera actualizărilor la actualizările care trec de acea verificare de siguranță. Mecanismul utilizat pentru a transforma codul și starea influențează ce tipuri de actualizări acceptă un sistem.
Sistemele DSU, ca instrumente, pot fi, de asemenea, evaluate în funcție de ușurința lor de utilizare și de claritatea pentru dezvoltatori. Multe sisteme DSU, cum ar fi Ginseng , necesită programe pentru a trece diverse analize statice. În timp ce aceste analize dovedesc proprietăți ale programelor care sunt valoroase pentru DSU, ele sunt, prin natura lor, sofisticate și dificil de înțeles. Sistemele DSU care nu utilizează o analiză statică ar putea necesita utilizarea unui compilator specializat. Unele sisteme DSU nu necesită nici analize statice, nici compilatoare de specialitate.
Programele care sunt actualizate de un sistem DSU sunt denumite programe țintă . Publicațiile academice ale sistemelor DSU includ de obicei mai multe programe țintă ca studii de caz. vsftpd , OpenSSH , PostgreSQL , Tor , Apache , GNU Zebra , memcached și Redis sunt toate ținte dinamice de actualizare pentru diferite sisteme. Deoarece puține programe sunt scrise având în vedere actualizarea dinamică, adaptarea programelor existente este un mijloc valoros de evaluare a unui sistem DSU pentru utilizare practică.
Domenii conexe
Spațiul problematic abordat de actualizarea dinamică poate fi gândit ca o intersecție cu alte câteva. Exemplele includ punctele de control , conectarea dinamică și persistența . De exemplu, o bază de date care trebuie să fie compatibilă cu versiunile anterioare ale formatului său de fișier pe disc, trebuie să realizeze același tip de transformare a stării așteptată de la un sistem de actualizare dinamică. La fel, un program care are o arhitectură de plugin, trebuie să poată încărca și executa cod nou în timpul rulării.
Tehnici similare sunt uneori folosite și în scopul eliminării dinamice a codului mort pentru a elimina codul mort sau inaccesibil condiționat la încărcare sau timp de rulare și pentru a recombina codul rămas pentru a minimiza amprenta sa de memorie sau pentru a îmbunătăți viteza.
Istorie
Cel mai devreme precursor al actualizării dinamice a software-ului sunt sistemele redundante . Într-un mediu redundant, există sisteme de rezervă gata să preia controlul calculelor active în cazul unei defecțiuni a sistemului principal. Aceste sisteme conțin o mașină principală și o rezervă fierbinte . Rezerva fierbinte ar fi însămânțată periodic cu un punct de control al sistemului primar. În cazul unei defecțiuni, rezerva la cald ar prelua, iar mașina principală va deveni noua rezervă la cald. Acest model poate fi generalizat la actualizare. În cazul unei actualizări, rezerva la cald se va activa, sistemul principal se va actualiza și apoi sistemul actualizat va relua controlul.
Cea mai timpurie adevărat sistem Actualizarea Software - ul dinamic este DYMOS ( Dy Namic Mo dification S ystem). Prezentat în 1983 în disertația de doctorat a lui Insup Lee, DYMOS a fost un sistem complet integrat care avea acces la o interfață interactivă de utilizator, un compilator și un timp de rulare pentru o variantă Modula și un cod sursă. Aceasta a permis DYMOS să verifice actualizările cu programul existent.
Implementare
Sistemele DSU trebuie să încarce noul cod într-un program care rulează și să transforme starea existentă într-un format care este înțeles de noul cod. Deoarece multe cazuri de utilizare motivaționale ale DSU sunt critice în timp (de exemplu, implementarea unei soluții de securitate pe un sistem viu și vulnerabil), sistemele DSU trebuie să ofere disponibilitate adecvată de actualizare . Unele sisteme DSU încearcă, de asemenea, să se asigure că actualizările sunt sigure înainte de a le aplica.
Nu există nicio soluție canonică la niciuna dintre aceste probleme. De obicei, un sistem DSU care funcționează bine într-un domeniu problematic face acest lucru la un compromis cu alții. De exemplu, testarea empirică a actualizărilor dinamice indică faptul că creșterea numărului de puncte de actualizare are ca rezultat un număr crescut de actualizări nesigure.
Transformarea codului
Majoritatea sistemelor DSU folosesc subrutine ca unitate de cod pentru actualizări; cu toate acestea, sistemele DSU mai noi implementează actualizări ale întregului program.
Dacă programul țintă este implementat într-un limbaj de mașină virtuală , VM poate utiliza infrastructura existentă pentru a încărca cod nou, deoarece mașinile virtuale moderne acceptă încărcarea în timp de rulare pentru alte cazuri de utilizare în afară de DSU (în principal depanare ). De HotSpot JVM sprijină în momentul rulării codului de încărcare și sistemele de direcționare DSU Java (limbaj de programare) poate utiliza această caracteristică.
În limbile native, cum ar fi C sau C ++ , sistemele DSU pot utiliza compilatoare specializate care inserează indirectarea în program. La momentul actualizării, această indirectare este actualizată pentru a indica cea mai nouă versiune. Dacă un sistem DSU nu folosește un compilator pentru a insera aceste indirecții în mod static, le introduce în timpul rulării cu rescriere binară . Rescrierea binară este procesul de scriere a codului de nivel scăzut în imaginea de memorie a unui program nativ care rulează pentru redirecționarea funcțiilor. Deși acest lucru nu necesită nicio analiză statică a unui program, acesta depinde foarte mult de platformă.
Ekiden și Kitsune încarcă un nou cod de program prin pornirea unui program complet nou, fie prin fork-exec sau încărcare dinamică . Starea programului existent este apoi transferată în noul spațiu al programului.
Transformarea statului
În timpul unei actualizări, starea programului trebuie transformată din reprezentarea originală în reprezentarea noii versiuni. Aceasta este denumită transformare de stat . O funcție care transformă un obiect de stare sau un grup de obiecte este denumită funcție de transformator sau transformator de stare .
Sistemele DSU pot fie să încerce să sintetizeze funcțiile transformatorului, fie să solicite ca dezvoltatorul să le furnizeze manual. Unele sisteme amestecă aceste abordări, deducând unele elemente ale transformatoarelor, necesitând în același timp intrarea dezvoltatorului pe altele.
Aceste funcții ale transformatorului pot fi aplicate stării programului leneș, deoarece fiecare acces la starea de versiune veche este accesată, sau transformând cu nerăbdare toată starea la momentul actualizării. Transformarea leneșă asigură că actualizarea se va finaliza în timp constant, dar implică, de asemenea, cheltuieli generale la accesul la obiect. Transformarea dornică implică mai multe cheltuieli în momentul actualizării, necesitând sistemul să oprească lumea în timp ce toate transformatoarele rulează. Cu toate acestea, transformarea dornică permite compilatorilor să optimizeze pe deplin accesul de stat, evitând cheltuielile generale în starea de echilibru implicate de transformarea leneșă.
Actualizați siguranța
Majoritatea sistemelor DSU încearcă să afișeze unele proprietăți de siguranță pentru actualizări. Cea mai comună variantă de verificare a siguranței este tipul de siguranță, în cazul în care o actualizare este considerată sigură dacă nu are ca rezultat un cod nou care să funcționeze pe o reprezentare de stare veche, sau invers.
Siguranța tipului este de obicei verificată prin afișarea uneia dintre cele două proprietăți, siguranța activității sau siguranța contra-gratuită . Un program este considerat sigur pentru activitate dacă nu există o funcție actualizată pe stiva de apeluri la momentul actualizării. Acest lucru demonstrează siguranță, deoarece controlul nu poate reveni niciodată la codul vechi care ar accesa noi reprezentări de date.
Contra-Freeness este un alt mod de a dovedi siguranța tipului, unde o secțiune de cod este considerată sigură dacă nu accesează starea unui tip dat într-un mod care necesită cunoașterea reprezentării tipului. Se poate spune că acest cod nu accesează statul în mod concret , în timp ce poate accesa statul în mod abstract . Este posibil să dovedească sau să respingă contra-gratuitatea pentru toate tipurile din orice secțiune de cod, iar sistemul DSU Ginseng îl folosește pentru a dovedi siguranța tipului. Dacă o funcție este dovedită fără contra , aceasta poate fi actualizată chiar dacă este activă în stivă, deoarece nu va provoca o eroare de tip prin accesarea stării folosind vechea reprezentare.
Analiza empirică a contra-libertății și siguranței activității de către Hayden și toate arată că ambele tehnici permit actualizări corecte și resping actualizările cele mai eronate. Cu toate acestea, selectarea manuală a punctelor de actualizare are ca rezultat erori de actualizare zero și permite totuși disponibilitatea actualizării frecvente.
Sisteme existente
DYMOS
DYMOS este remarcabil prin faptul că a fost cel mai vechi sistem DSU propus. DYMOS constă dintr-un mediu complet integrat pentru programe scrise într-un derivat al Modulei , oferind sistemului acces la un interpret de comandă, cod sursă, compilator și mediu de rulare, similar cu un REPL . În DYMOS, actualizările sunt inițiate de un utilizator care execută o comandă în mediul interactiv. Această comandă include directive care specifică când se poate produce o actualizare, numite condiții de moment . Informațiile disponibile pentru DYMOS îi permit să impună siguranța de tip a actualizărilor cu privire la programul țintă care rulează.
Ksplice, kpatch și kGraft
Ksplice este un sistem DSU care vizează numai nucleul Linux , devenind unul dintre sistemele DSU specializate care acceptă un nucleu de sistem de operare ca program țintă. Ksplice folosește diferențe la nivel de sursă pentru a determina modificările dintre versiunile curente și actualizate ale kernel-ului Linux și apoi folosește rescrierea binară pentru a insera modificările în kernel-ul care rulează. Ksplice a fost întreținut de o întreprindere comercială fondată de autorii săi originari, Ksplice Inc., care a fost achiziționată de Oracle Corporation în iulie 2011. Ksplice este utilizat pe bază comercială și exclusiv în distribuția Oracle Linux .
SUSE a dezvoltat kGraft ca o alternativă open-source pentru patch-urile de kernel live, iar Red Hat a făcut același lucru cu kpatch . Ambele permit aplicarea modificărilor la nivel de funcție la un nucleu Linux care rulează, bazându-se în același timp pe mecanisme de patch-uri live stabilite de ftrace . Diferența principală între kGraft și kpatch este modul în care asigură coerența în timp de rulare a secțiunilor de cod actualizate în timp ce se aplică patch-uri fierbinți . kGraft și kpatch au fost trimise pentru includere în linia principală a kernel-ului Linux în aprilie 2014 și, respectiv, în mai 2014, iar bazele minimaliste pentru patch-uri live au fost îmbinate în linia principală a kernel-ului Linux în versiunea kernel 4.0, care a fost lansată pe 12 aprilie 2015.
Din aprilie 2015, se lucrează în continuare la portarea kpatch și kGraft la nucleul comun de patch-uri live furnizat de linia principală a kernel-ului Linux. Cu toate acestea, implementarea mecanismelor de consistență la nivel de funcție, necesare pentru tranziții sigure între versiunile originale și corecte ale funcțiilor, a fost întârziată, deoarece stivele de apel furnizate de kernel-ul Linux pot fi nesigure în situații care implică codul de asamblare fără cadre de stivă adecvate ; ca rezultat, lucrările de portare rămân în desfășurare începând cu septembrie 2015. În încercarea de a îmbunătăți fiabilitatea stack-urilor de apel ale kernel-ului, a fost dezvoltat și un utilitar de spațiu de utilizator stacktool specializat pentru verificarea sănătății cu scopul de a verifica fișierele obiect în timp de compilare ale kernel-ului. și asigurarea menținerii întotdeauna a stivei de apeluri; de asemenea, deschide o posibilitate de a obține stive de apeluri mai fiabile ca parte a mesajelor kernel - ului .
Ginseng
Ginseng este un sistem DSU de uz general. Este singurul sistem DSU care folosește tehnica de siguranță contra freeness , permițându-i să actualizeze funcțiile care sunt live pe stivă, atâta timp cât nu fac acces concret la tipurile actualizate.
Ginseng este implementat ca un compilator sursă-la-sursă scris folosind cadrul C Language Intermediate în OCaml . Acest compilator introduce indirecție la toate apelurile de funcții și accesele de tip, permițând Ginseng să transforme leneș starea în costul impunerii unei cheltuieli generale în timp constant pentru întreaga execuție a programului. Compilatorul Ginseng demonstrează proprietățile contra-freeness ale întregului program inițial și ale patch-urilor dinamice.
Versiunile ulterioare ale Ginseng acceptă, de asemenea, o noțiune de siguranță tranzacțională. Acest lucru permite dezvoltatorilor să adnoteze o secvență de apeluri de funcții ca o unitate logică, împiedicând actualizările să încalce semantica programului în moduri care nu sunt detectabile nici prin siguranța activității, nici prin siguranța contra-gratuită . De exemplu, în două versiuni de OpenSSH examinate de autorii Ginseng, un cod important de verificare a utilizatorului a fost mutat între două funcții numite în ordine. Dacă prima versiune a primei funcții a fost executată, a avut loc o actualizare și noua versiune a celei de-a doua funcții a fost executată, atunci verificarea nu ar fi efectuată niciodată. Marcarea acestei secțiuni ca tranzacție asigură faptul că o actualizare nu va împiedica verificarea.
UpStare
UpStare este un sistem DSU care utilizează un mecanism unic de actualizare, reconstrucția stivei . Pentru a actualiza un program cu UpStare, un dezvoltator specifică o mapare între eventualele cadre de stivă. UpStare este capabil să utilizeze această mapare pentru a actualiza imediat programul în orice moment, cu orice număr de fire și cu orice funcții live în stivă.
PoLUS
POLUS este un sistem de rescriere binar DSU pentru C . Este capabil să actualizeze programele nemodificate în orice moment al executării lor. Pentru a actualiza funcțiile, rescrie preludiul unei funcții țintă pentru a redirecționa către o funcție nouă, înlănțuind aceste redirecționări pe mai multe versiuni. Acest lucru evită cheltuielile generale în funcție care nu au fost actualizate.
Katana
Katana este un sistem de cercetare care oferă o actualizare dinamică limitată (similară cu Ksplice și furcile sale) pentru binarele ELF în modul utilizator . Modelul de corecție Katana funcționează la nivelul obiectelor ELF și, prin urmare, are capacitatea de a fi agnostic în limbă, atâta timp cât ținta de compilare este ELF.
Kitsune și Ekiden
Ekiden și Kitsune sunt două variante ale unui singur sistem DSU care implementează stilul de transfer de stat de DSU pentru programe scrise în C . În loc să actualizeze funcțiile într-un singur program, Ekiden și Kitsune efectuează actualizări pe programe întregi, transferând starea necesară între cele două execuții. În timp ce Ekiden realizează acest lucru pornind un nou program folosind idiomul UNIX de fork-exec , serializând starea programului țintă și transferându-l, Kitsune folosește legătura dinamică pentru a efectua transferul de stare „în loc”. Kitsune este derivat din baza de cod a lui Ekiden și poate fi considerat o versiune ulterioară a lui Ekiden.
Ekiden și Kitsune sunt, de asemenea, remarcabile prin faptul că sunt implementate în principal ca biblioteci la nivel de aplicație, mai degrabă decât runtime specializate sau compilatoare. Ca atare, pentru a utiliza Ekiden sau Kitsune, un dezvoltator de aplicație trebuie să marcheze manual starea care urmează să fie transferată și să selecteze manual punctele din program unde poate avea loc o actualizare. Pentru a ușura acest proces, Kitsune include un compilator specializat care implementează un limbaj specific domeniului pentru scrierea transformatoarelor de stare.
Erlang
Erlang acceptă actualizarea dinamică a software-ului, deși aceasta este denumită în mod obișnuit „ încărcare cod fierbinte ”. Erlang nu necesită garanții de siguranță pentru actualizări, dar cultura Erlang sugerează ca dezvoltatorii să scrie într-un stil defensiv care să gestioneze cu grație erorile de tip generate de actualizare.
Pymoult
Pymoult este o platformă de prototipare pentru actualizarea dinamică scrisă în Python. Adună multe tehnici din alte sisteme, permițând combinarea și configurarea lor. Obiectivul acestei platforme este de a permite dezvoltatorilor să aleagă tehnicile de actualizare pe care le consideră mai potrivite pentru nevoile lor. De exemplu, se poate combina actualizarea leneșă a statului ca în Ginseng în timp ce se schimbă întregul cod al aplicației ca în Kitsune sau Ekiden.
Microsoft Visual C ++
Microsoft utilizează tehnologia de corecție internă pentru Microsoft Visual C ++ care acceptă corecția funcțiilor individuale C ++, menținând în același timp corectitudinea funcțională a corecțiilor. Aplicațiile cunoscute în prezent sunt SQL Server în baza de date SQL Azure.