{"version":3,"sources":["sections/Introduction.js","components/YoutubeEmbed.js","components/TimeHeading.js","images/koe-loki.png","sections/Demo.js","images/fs-test.png","components/LinkBlock.js","sections/Summary.js","images/GitHub.png","images/YTL.png","sections sync /^/.//.*$","components/Section.js","components/Authors.js","images/avatars/eemil.png","images/avatars/ruben.png","images/avatars/mikael.png","App.js","reportWebVitals.js","index.js"],"names":["Introduction","YoutubeEmbed","id","class","title","src","frameborder","gesture","allow","allowfullscreen","TimeHeading","data","time","description","className","Demo","text","language","showLineNumbers","theme","dracula","customStyle","borderRadius","display","codeContainerStyle","highlight","koeLogPicture","alt","LinkBlock","icon","siteName","date","url","href","target","rel","Summary","map","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","sections","require","Section","name","default","Authors","author","avatar","join","App","EemilAvatar","RubenAvatar","MikaelAvatar","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"6KAAe,SAASA,IACpB,OACI,gCACI,oiBAGA,+BACI,6CACI,+BACI,+FACA,wCACA,6DAGR,mDACI,6BACI,2HAGR,wDACI,+BACI,kHACA,+HAIZ,gPAGA,6RAGA,4BACI,mI,0FCjCT,SAASC,EAAT,GAA6B,IAANC,EAAK,EAALA,GAC1B,OACI,qBAAKC,MAAM,eAAX,SACI,wBAAQC,MAAOF,EAAIG,IAAK,iCAAmCH,EAAII,YAAY,IAAIC,QAAQ,QAAQC,MAAM,kBAAkBC,iBAAe,MCH3I,SAASC,EAAT,GAA8B,IAARC,EAAO,EAAPA,KAClBP,EAA4BO,EAA5BP,MAAOQ,EAAqBD,EAArBC,KAAMC,EAAeF,EAAfE,YACpB,OACI,sBAAKC,UAAU,cAAf,UACI,+BACKF,EAAO,sBAAME,UAAU,OAAhB,SAAwBF,IAAe,GADnD,IACwDR,KAEtDS,EACF,sBAAMC,UAAU,cAAhB,SACKD,IAEH,M,WCXC,MAA0B,qCCQ1B,SAASE,IACpB,OACI,gCACI,gEACA,cAACd,EAAD,CAAcC,GAAG,gBAEjB,cAACQ,EAAD,CAAaC,KAAM,CACfP,MAAO,aACPQ,KAAM,cACNC,YAAa,2DAEjB,wRAIA,cAACH,EAAD,CAAaC,KAAM,CACfP,MAAO,OACPQ,KAAM,cACNC,YAAa,uDAEjB,4eAGA,2NAGA,cAAC,IAAD,CACIG,KAAK,kHAELC,SAAS,OACTC,iBAAiB,EACjBC,MAAOC,IACPC,YAAa,CAACC,aAAc,OAAQC,QAAS,QAAS,aAAc,UACpEC,mBAAoB,CAACD,QAAS,WAElC,uBAEA,cAACb,EAAD,CAAaC,KAAM,CACfP,MAAO,2CACPQ,KAAM,cACNC,YAAa,mDAEjB,kkBAGA,wQAGA,cAAC,IAAD,CACIG,KAAI,uhBAcJC,SAAS,KACTC,iBAAiB,EACjBC,MAAOC,IACPK,UAAU,MACVJ,YAAa,CAACC,aAAc,OAAQC,QAAS,QAAS,aAAc,UACpEC,mBAAoB,CAACD,QAAS,WAElC,kbAGA,yUAGA,yjBAKA,yFAGA,+BACI,yNAGA,mTAKJ,cAACb,EAAD,CAAaC,KAAM,CACfP,MAAO,MACPQ,KAAM,cACNC,YAAa,oFAEjB,2TAGA,+QAGA,qsBAIA,cAACH,EAAD,CAAaC,KAAM,CACfP,MAAO,0CAEX,gaAGA,0RAGA,wHAGA,cAAC,IAAD,CACIY,KAAI,iLAUJC,SAA6D,QAC7DC,iBAAiB,EACjBC,MAAOC,IACPC,YAAa,CAACC,aAAc,OAAQC,QAAS,QAAS,aAAc,UACpEC,mBAAoB,CAACD,QAAS,WArItC,IAuII,sQAGA,gNAGA,qBAAKlB,IAAKqB,EAAeC,IAAI,6BAA6Bb,UAAU,YACpE,kHAGA,qBAAKT,IC3JF,6yTD2JsBsB,IAAI,gDAAuCb,UAAU,iB,0FE3JnF,SAASc,EAAT,GAA4B,IAARjB,EAAO,EAAPA,KAChBP,EAAoCO,EAApCP,MAAOyB,EAA6BlB,EAA7BkB,KAAMC,EAAuBnB,EAAvBmB,SAAUC,EAAapB,EAAboB,KAAMC,EAAOrB,EAAPqB,IACpC,OACI,oBAAGC,KAAMD,EAAKlB,UAAU,YAAYoB,OAAO,SAASC,IAAI,aAAxD,UACI,iCAAO/B,EAAP,IAAe2B,EAAO,sBAAMjB,UAAU,OAAhB,SAAwBiB,IAAe,MAC7D,iCACI,qBAAK1B,IAAKwB,EAAMF,IAAKG,IACpBA,QCFF,SAASM,IACpB,OACI,gCACI,4CACA,8cAIA,+DACA,iHAGA,cAACR,EAAD,CAAWjB,KAAM,CACbkB,KClBD,ykEDmBCG,IAAK,qDACLF,SAAU,SACV1B,MAAO,uCAEX,6cAIA,oPAGA,cAACwB,EAAD,CAAWjB,KAAM,CACbkB,KE/BD,6wFFgCCG,IAAK,4FACLF,SAAU,YACV1B,MAAO,uDACP2B,KAAM,mB,6DGnCtB,IAAIM,EAAM,CACT,SAAU,GACV,YAAa,GACb,iBAAkB,GAClB,oBAAqB,GACrB,YAAa,GACb,eAAgB,IAIjB,SAASC,EAAeC,GACvB,IAAIrC,EAAKsC,EAAsBD,GAC/B,OAAOE,EAAoBvC,GAE5B,SAASsC,EAAsBD,GAC9B,IAAIE,EAAoBC,EAAEL,EAAKE,GAAM,CACpC,IAAII,EAAI,IAAIC,MAAM,uBAAyBL,EAAM,KAEjD,MADAI,EAAEE,KAAO,mBACHF,EAEP,OAAON,EAAIE,GAEZD,EAAeQ,KAAO,WACrB,OAAOC,OAAOD,KAAKT,IAEpBC,EAAeU,QAAUR,EACzBS,EAAOC,QAAUZ,EACjBA,EAAepC,GAAK,I,4EC3BdiD,G,YAAWC,OAEV,SAASC,EAAT,GAA0B,IAARC,EAAO,EAAPA,KACrB,OAAOH,EAAS,KAAOG,GAAMC,U,WCH1B,SAASC,EAAT,GAAgC,IAAd7C,EAAa,EAAbA,KAAMoB,EAAO,EAAPA,KAC3B,OACI,sBAAKjB,UAAU,UAAf,UACI,qBAAKA,UAAU,UAAf,SACKH,EAAK0B,KAAI,SAAAoB,GAAM,OACZ,qBAAkCpD,IAAKoD,EAAOC,OAAQ/B,IAAK8B,EAAOH,MAAxD,SAAWG,EAAOH,WAGpC,sBAAKxC,UAAU,OAAf,UACI,+BAAOH,EAAK0B,KAAI,SAAAoB,GAAM,OAAIA,EAAOH,QAAMK,KAAK,QAC5C,+BAAO5B,UCVR,UAA0B,kCCA1B,MAA0B,kCCA1B,MAA0B,mCC8C1B6B,MArCf,WACI,OACI,qBAAK9C,UAAU,MAAf,SACI,0BAASA,UAAU,SAAnB,UACI,oDACA,cAACuC,EAAD,CAASC,KAAK,iBACd,uBACA,cAACD,EAAD,CAASC,KAAK,SACd,uBACA,cAACD,EAAD,CAASC,KAAK,YACd,uBACA,sBAAKxC,UAAU,SAAf,UACI,cAAC0C,EAAD,CAAS7C,KAAM,CACX,CACI2C,KAAM,QACNI,OAAQG,GAEZ,CACIP,KAAM,QACNI,OAAQI,GAEZ,CACIR,KAAM,SACNI,OAAQK,IAGhBhC,KAAK,wBACL,uBACA,2CACgB,mBAAGjB,UAAU,aAAamB,KAAK,4BAA/B,wCC1BrB+B,EAZS,SAAAC,GAClBA,GAAeA,aAAuBC,UACxC,gCAAqBC,MAAK,YAAkD,IAA/CC,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAON,GACPO,EAAQP,OCDdQ,IAASC,OACP,cAAC,IAAMC,WAAP,UACE,cAAC,EAAD,MAEFC,SAASC,eAAe,SAM1Bb,M","file":"static/js/main.ed534374.chunk.js","sourcesContent":["export default function Introduction() {\n return (\n
\n

\n Ilmoitimme Ylioppilastutkintolautakunnalle keväällä 2021 lukuisista haavoittuvuuksista Abitti-koejärjestelmästä. Haavoittuvuussarja antoi hyökkääjälle täyden pääsyn koetilan palvelimelle ja jokaiseen siihen yhdistäneeseen kokelaan tietokoneeseen pääkäyttäjänä. Haavoittuvuudet koskettivat kaikkia Suomen lukioita ja sähköisiä ylioppilaskirjoituksia. Alttiina lukemiselle, muokkaamiselle, poistamiselle, ja häiriköinnille olivat muun muassa:\n

\n \n

\n Mahdollinen tietovuoto olisi voinut olla hyvin vakava ja sisältää suuria määriä kokelaiden arkaluontoistakin dataa. Puhumattakaan vilpin ja koetilanteen häiriköinnin mahdollisuudesta.\n

\n

\n Tämä kaikki löydettiin noin kolmen kuukauden tiimityön ja lukuisten Abitin lähdekoodin parissa vietettyjen tuntien ansiosta. Nyt kuitenkin pääsemme jakamaan työmme tuloksia ja olemme tästä yhtä innoissamme kuin tekin :)\n

\n

\n Haavoittuvuuden hyödyntämiseen tarkoitettu koodi on tämän postauksen lopussa ;)\n

\n
\n\n )\n};","export function YoutubeEmbed({id}) {\n return (\n
\n \n
\n )\n}","export function TimeHeading({data}) {\n const {title, time, description} = data;\n return (\n
\n

\n {time ? {time} : ''} {title} \n

\n { description ?\n \n {description}\n \n : ''}\n
\n );\n}","export default __webpack_public_path__ + \"static/media/koe-loki.d00fab59.png\";","import { YoutubeEmbed } from '../components/YoutubeEmbed';\nimport { TimeHeading } from '../components/TimeHeading';\n\nimport { CodeBlock, dracula } from \"react-code-blocks\";\n\nimport koeLogPicture from '../images/koe-loki.png';\nimport fsTestPicture from '../images/fs-test.png';\n\nexport default function Demo() {\n return (\n
\n

Demonstraatio ja rekonstruktio

\n \n\n \n

\n Kokelastikun ABITTI2106S levykuvaan on tehty muokkauksia, jotka sallivat pääsyn komentokehotteeseen ja ujuttamaan tiedostojärjestelmään tarvittavat skriptimme. Muutokset tekee videolla hetkellisesti esitelty AntiBitti-työkalumme.\n

\n\n \n

\n Koetilan palvelin tiedustelee kaikilta kokelaslaitteilta dataa 20 - 30 minuutin välein. Korvaamme kokelaslaitteen vastauspalvelimen omalla muokatulla palvelimella “nsamock.js”, jolla voimme itse määrittää koetilan palvelimelle annetun vastauksen. Tätä hyökkäystekniikkaa kutsutaan nimellä “Server Side Request Forgery” (SSRF), jota voisi suomeksi luonnehtia palvelinpuolen pyynnön väärentämiseksi.\n

\n

\n Vastaamme koetilan palvelimen NSA-palvelun (kokeen valvontapalvelu) pyyntöön haavoittuvuusketjun laukaisevalla vastauksella, joka avaa ovet hyökkäyksen seuraaville vaiheille:\n

\n \n
\n\n \n

\n Edellisessä vaiheessa palautimme koetilan palvelimella toimivalle NSA-palvelulle vastauksen, jonka HTTP-statuskoodina oli 307. Tämä koodi pyytää koetilan palvelimen HTTP-asiakasohjelman uudelleenohjaamaan pyyntönsä toiseen osoitteeseen. Annettu osoite on koetilan palvelimella käynnissä olevan palvelun osoite, joka on eristetty palomuurilla muilta kuin palvelimelta itseltään. Ohjaamme siis koetilan palvelimen tekemään pyynnön itseelleen ja muokkaamme samalla pyynnön osoitetta. Palomuuri ohitettu.\n

\n

\n Koetilan palvelimelle annettu uudelleenohjaus sen aikaisemmalle pyynnölle ohjautuu tarkoin valittuun osoitteeseen: yhteen sen sisäiseen web-palvelimeen, joka on haavoittuvainen “Shell injection”-hyökkäykselle:\n

\n \n createAnswersZip()\n .then(zip => fs.writeFileAsync(tmpAnswersPackageFile, zip))\n .then(() => {\n if (config.isProd) {\n childProcess.exec(\n \\`/usr/bin/sudo -u digabi /usr/local/bin/digabi-download-progress\n \\${tmpAnswersPackageFile} \\${req.params.answersFilename}\\`\n )\n }\n })\n .then(() => res.json({ useDevModeAnswerDownloading: !config.isProd }))\n .catch(next)\n)`}\n language=\"js\"\n showLineNumbers={false}\n theme={dracula}\n highlight=\"6-9\"\n customStyle={{borderRadius: \"10px\", display: \"block\", \"overflow-y\": \"hidden\"}}\n codeContainerStyle={{display: \"block\"}}\n />\n

\n Polun “/start-answer-downloader/:answersFilename”-metodin alkuperäinen tarkoitus on toimia tapana kokeen järjestäjälle ladata kokeen vastauksia USB-tikulle tai johonkin muuhun järjestelmän sijaintiin. Tämän takia videolla hyökkäyksen tässä vaiheessa ilmestyy “valitse sijanti”-ikkuna. Tämä ikkuna olisi kuitenkin todella helppoa piilottaa.\n

\n

\n Tutkiessa ylhäällä olevaa koodia tarkemmin voi helposti huomata selkeän “Shell injection”-haavoittuvuuden, kohdassa jossa “req.params.answersFilename” lisätään suoraan komentoriville. Käyttäjän syötettä ei tarkisteta tai sanitoida lainkaan.\n

\n

\n Pääkäyttäjän oikeudet saa koetila-käyttäjältä (jolla Shell injection koodia ajetaan) helposti,\n hyödyntämällä virhettä Abitin sudo-asetuksissa. Koetila-käyttäjä saa ajaa pääkäyttäjänä vain muutaman ohjelman, esimerkiksi sijainnissa\n /tmp/ktp-update-work/ktp-update.sh olevan skriptin. Koetila-käyttäjä voi kuitenkin myös kirjoittaa tähän tiedostoon täysin vapaasti, näin antaen meille helpon tavan saavuttaa pääkäyttäjän oikeudet.\n

\n

\n Lähetetyssä komennossa on kaksi keskeistä osaa:\n

\n
    \n
  1. \n Ensimmäinen rivi avaa kaiken liikenteen Abitin koetilan palvelimelle ja siltä ulos. Teknisesti puhuen se tyhjentää palomuurin asetukset, näin sallien kaiken liikenteen.\n
  2. \n
  3. \n Toinen rivi luo etäyhteyden, jonka avulla voi kätevästi lähettää komentoja koetilan palvelimelle. Se luo ja käynnistää Node.js:llä kirjoitetun TCP Socket-pohjaisen RCE-palvelimen (Remote Code Execution, eli komentojen suoritus etänä).\n
  4. \n
\n\n \n

\n Hyökkääjän laitteella avataan aikaisemmin käynnistetyn RCE-palvelimen asiakasohjelma “nclient.js”. Tämä ohjelma toimii käytännössä samalla tavalla kuin SSH ja omaa kaikki pääkäyttäjän luvat ajaa koodia koetilan palvelimella.\n

\n

\n Videossa demonstroidaan etäyhteyttä useaan otteeseen, esimerkiksi avaamalla koetilan palvelimen ruudulle uuden selainvälilehden Firefoxissa, uuden muistion, sekä lopuksi välittömästi sammuttamalla koetilan palvelimen. \n

\n

\n Pääkäyttäjän oikeudet kuitenkin mahdollistavat paljon vakavampia kokeen valvonnalta piilossa olevia toimia. Se mahdollistaa kaikenlaisen koetilanteen häirinnän, tallenteiden lukemisen, muokkaamisen ja poistamisen. Pääkäyttäjän oikeudet koetilan palvelimella antavat myös paljon mahdollisuuksia muiden sen verkossa olevien Abitti-koneiden kaappaamiseksi, joka vaarantaa myös kokelaiden henkilökohtaisten tietojen turvallisuuden heidän koneillaan, vaikka Abitissa koneiden tallennustila ei olisi kokelaille tavallisesti näkyvissä, sillä pääkäyttäjänä voimme päästä levyihin käsiksi vapaasti.\n

\n\n \n

\n Koetilan palvelimessa on kokelaiden laitteille tarkoitettu automaattinen päivitysmekanismi, joka lähettää päivityspaketin kokelaiden laitteille niiden liittyessä kokeeseen. Kaappaamalla koetilan palvelimen, voimme luoda oman päivityspaketin, joka antaa meille yksinkertaisesti tavan suorittaa koodia kokelaiden laitteilla pääkäyttäjän oikeuksilla.\n

\n

\n Polkuun /var/lib/ktpjs/public/koe-update/ tehdään zip-arkisto nimellä “koe-update.zip”, joka sisältää skriptitiedoston “koe-update.sh”. Kokelaan laite suorittaa tämän skriptin avattuaan päivityspaketin.\n

\n

\n Esimerkki mahdollisesta hyökkäyksessä käytettävästä skriptistä:\n

\n > /home/digabi/pwned.txt\n\nexport DISPLAY=:0\n\nsudo -u digabi notify-send \"ABITTI HAS BEEN PWNED!\"\n`}\n language={(process.env.NODE_ENV === 'development' ? 'text' : 'shell')}\n showLineNumbers={false}\n theme={dracula}\n customStyle={{borderRadius: \"10px\", display: \"block\", \"overflow-y\": \"hidden\"}}\n codeContainerStyle={{display: \"block\"}}\n />;\n

\n Esimerkkiskripti luo tiedostojärjestelmän juureen tiedoston, jonka luomiseen on normaalisti oikeus vain pääkäyttäjällä. Se myös lähettää työpöytäilmoituksen koetilapalvelimen ruudulle.\n

\n

\n Avaamalla kokelaan “digabi-koe” Systemd-palvelun lokin, voi huomata päivityspaketin sisältäneen koodin tulleen suoritetuksi pääkäyttäjänä:\n

\n \"Kuvankaappaus\n

\n Tässä vielä skriptin luoma tiedosto tiedostojärjestelmän juuressa:\n

\n \"Kuvankaappaus\n
\n );\n}","export default \"data:image/png;base64,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\"","export function LinkBlock({data}) {\n const {title, icon, siteName, date, url} = data;\n return (\n \n {title} {date ? {date} : ''}\n \n {siteName}\n {siteName}\n \n \n );\n}","import { LinkBlock } from '../components/LinkBlock';\n\nimport GitHubIcon from '../images/GitHub.png';\nimport YTLIcon from '../images/YTL.png';\n\nexport default function Summary() {\n return (\n
\n

Yhteenveto

\n

\n Haluamme kiittää ylioppilastutkintolautakuntaa hyvin asiallisesta tietoturvailmoituksen käsittelystä ja ripeästä toiminnasta. He ovat hoitaneet tapauksen mallikkaasti sisäisesti ja ulkoisesti. Etenkin hyvänä yksityiskohtana haluamme tuoda esiin huolellisesti suunnitellun julkaisuaikataulun tekemistä korjausta varten, jossa otettiin huomioon erilaisia vaihtoehtoja huomioimalla niiden uhat ja edut.\n

\n\n

Haavoittuvuuden lähdekoodi

\n

\n Hyökkäyksen suorittamiseen tarvittava koodi on saatavilla täältä: \n

\n \n

\n Haavoittuvuuden vaiheita voit kokeilla viimeisimmällä toimivalla kokelaan tikun versiolla ABITTI2106S (tai vanhemmat, 1.10.2019 asti) ja palvelimen tikun versiolla SERVER21066 (tai vanhemmat, 1.10.2019 asti). Tämä haavoittuvuus on korjattu viime päivityksissä, joten sen testaaminen oikeissa koetilanteessa on turhaa ja voi pahimmillaan johtaa jopa kahden vuoden vankeustuomioon (ks. RL 38:7 a § ja 8 §).\n

\n\n

\n Lue Ylioppilastutkintolautakunnan katsaus tästä haavoittuvuussarjasta seuraavasta blogiartikkelista, sekä sen tietoturvakäytännöistä ja vapaaehtoisten tietoturvaraporttien tärkeydestä: \n

\n \n
\n );\n}","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","var map = {\n\t\"./Demo\": 14,\n\t\"./Demo.js\": 14,\n\t\"./Introduction\": 13,\n\t\"./Introduction.js\": 13,\n\t\"./Summary\": 15,\n\t\"./Summary.js\": 15\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 32;","const sections = require.context('../sections', true);\n\nexport function Section({name}) {\n return sections('./' + name).default();\n}","export function Authors({data, date}) {\n return (\n
\n
\n {data.map(author => (\n {author.name}\n ))}\n
\n
\n {data.map(author => author.name).join(', ')}\n {date}\n
\n
\n )\n}","export default __webpack_public_path__ + \"static/media/eemil.85dd9b69.png\";","export default __webpack_public_path__ + \"static/media/ruben.46b5a711.png\";","export default __webpack_public_path__ + \"static/media/mikael.82ff0020.png\";","import './App.css';\n\nimport { Section } from './components/Section';\nimport { Authors } from './components/Authors';\n\nimport EemilAvatar from './images/avatars/eemil.png';\nimport RubenAvatar from './images/avatars/ruben.png';\nimport MikaelAvatar from './images/avatars/mikael.png';\n\nfunction App() {\n return (\n
\n
\n

Abitti Open Access

\n
\n
\n
\n
\n
\n
\n
\n \n
\n

\n 2021 © Testausserveri\n

\n
\n
\n
\n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}