Прайгравальныя зборкі для VPN-праграм: што даказвае супадзенне
Супадальная перазборка звязвае распаўсюджаны бінарны файл з абвешчанымі зыходнікамі і прыладамі. Яна нічога не кажа пра VPN-сэрвіс за гэтым файлам або пра яго журналы.
Прайгравальнасць — уласцівасць ланцуга паставак: адны і тыя ж абвешчаныя ўваходы павінны ствараць адзін і той жа артэфакт. Для VPN-кліента гэтае сцвярджэнне звязвае ўсталёўнік, які вы спампавалі, з зыходнікамі і інструментамі, якія можа перасабраць любы ахвотны. Пра сэрвіс, да якога падключаецца кліент, яно не кажа нічога.
Карыснае пытанне таму вузкае і мае адказ. Ці публікуе праект працэдуру, і ці адпавядае ёй менавіта ваш артэфакт?
Дзе зборка перастае быць дэтэрмінаванай
Кампілятары ўбудоўваюць часовыя меткі, абсалютныя шляхі і імёны зборачных хастоў, калі ім не забараніць гэта рабіць. Архівы запісваюць парадак файлаў і час іх змянення, лінкеры змяняюць вынік у залежнасці ад версіі інструментаў, а паралельнае сцісканне можа пераўпарадкаваць блокі. Любое з гэтага прыводзіць да таго, што дзве зборкі аднаго і таго ж зыходніка адрозніваюцца па байтах, і нічога злавеснага пры гэтым не адбываецца. Дэтэрмінаванасць убудоўваюць у зборку, а не атрымліваюць яе па змаўчанні.
Праект, які заяўляе прайгравальнасць, павінен назваць прымяняемую нармалізацыю: фіксаваныя часовыя меткі, адлюстраваныя шляхі, адсартаваныя запісы архіва, замацаваныя версіі кампілятара і залежнасцей. Без гэтага спісу разыходжанне немагчыма інтэрпрэтаваць, бо прастора дапушчальных варыяцый не вызначана.
Абвешчаныя ўваходы таксама павінны быць поўнымі. URL рэпазіторыя без тэга — не рэвізія, файл блакіроўкі без хэша — не набор залежнасцей, а зборачны скрыпт, які спампоўвае інструмент падчас выканання, мае ўваход, які ніхто не можа замацаваць. Кожная прага пазней ператвараецца ў адрозненне. Дапаўніце спіс, перш чым нешта параўноўваць, бо няпоўны спіс не можа праваліцца так, каб гэта нешта значыла.
| Input | How it drifts | What pins it |
|---|---|---|
| Source | Branch moves after release | Commit hash in the build metadata |
| Toolchain | Compiler patch level differs | Container image digest |
| Packaging | Archive order and mtimes vary | Normalised archive settings |
Што параўнанне насамрэч правярае
Незалежны бок перабудоўвае ў абвешчаным асяроддзі і параўноўвае вынік з апублікаваным артэфактам. Бітавая тоеснасць — гэта моцная форма; дакументаваны крок нармалізацыі, калі зафіксаванае адрозненне адмяняюць і вынікі тады супадаюць, — больш слабая, але ўсё яшчэ карысная форма.
Параўнанне датычыцца бінарнага файла. Подпіс адказвае на іншае пытанне: ён звязвае выпуск з ключом, а ключ — з асобай, і праект можа мець сапраўдныя подпісы над артэфактамі, якія ніхто не перабіраў. Дзве праверкі дапаўняюць адна адну, а не замяняюць.
sha256sum wireguard-installer.msi gpg --verify wireguard-installer.msi.sig wireguard-installer.msi
Выканайце абедзве перад усталяваннем і параўнайце хэш з апублікаваным для таго ж выпуску і платформы. Хэш, які супадае са старонкай пастаўшчыка, даказвае, што спампоўка прыйшла цэлай; перасабраны бінарны файл, які супадае з апублікаваным хэшам пастаўшчыка, даказвае нешта мацнейшае пра тое, як ён быў зроблены.
Чаму разыходжанне не даказвае ўмяшання
Большасць разыходжанняў паходзіць з уваходу, які ніхто не кантраляваў. Іншы выпуск патча кампілятара, шлях зборкі, які прасачыўся ў сімвалы адладкі, мова, што змяніла парадак сартавання, або крок упакоўкі, ужыты пасля параўнання, — усё гэта дае іншы хэш, чым сумленная праца.
Таму разыходжанне трэба чытаць супраць дакументаванай працэдуры, перш чым яно стане гісторыяй. Калі працэдура фіксуе ўсё, а розніца застаецца невытлумачанай, гэта сапраўдная знаходка, якую варта паведаміць праекту. Калі працэдура маўчыць пра ўпакоўку, розніца можа быць цалкам чаканай.
Сіметрыя тут таксама важная: супадзенне не даказвае, што зыходнікі без дэфектаў, а толькі што бінарны файл ім адпавядае. Добра правераны код і прайгравальны код — розныя ўласцівасці, і праект можа мець адну без другой.
Што заява кажа пра сэрвіс за праграмай
Кліент — гэта праграма на вашай прыладзе; сэрвіс — гэта серверы, сістэмы ўліковых запісаў і палітыкі захавання ў іншым месцы. Прайгравальнасць абмяжоўвае першае і нічога не кажа пра другое, як бы старанна ні правяраўся ўсталёўнік.
Канфігурацыя канчатковай кропкі таксама можа змяніцца пасля ўсталявання — праз аддаленыя налады або профіль, які кантралюе пастаўшчык. Гэтыя змены прыходзяць па сетцы і не пакрываюцца ніводным хэшам, які вы вылічылі перад падключэннем.
Чытайце заяву ў яе сапраўдным аб'ёме, затым асобна праверце суседняе пытанне: што пастаўшчык запісвае і ў якой юрысдыкцыі адказвае на запыты. Правераны бінарны файл і неправераны сэрвіс могуць існаваць разам, і менавіта гэты выпадак праверка ланцуга паставак прызначана зрабіць бачным, а не выправіць.