RAND_bytes wedi methu yn OpenVPN: gwall llyfrgell neu nod sydd ar goll
Gall methiant RAND_bytes olygu ffynhonnell entropi a wrthodwyd neu nod sy'n cuddio y tu ôl i gell. Darllenwch y ciw gwallau a gwedd y broses cyn creu dyfeisiau.
RAND_bytes() failed yw datganiad am un primitif lleol, nid am y cyfrif, y goriad a rennir ymlaen llaw na'r porth pell. Mae dau fethiant gwahanol iawn yn cynhyrchu'r un llinell ac yn gadael tystiolaeth wahanol. Un yw backend cryptograffig sy'n gwrthod allyrru beitiau; y llall yw proses nad yw'n cyrraedd y ffynhonnell entropi y cafodd ei chod ei adeiladu ar ei chyfer. Mae eu gwahanu yn gofyn am un darlleniad o'r ciw gwallau ac un cip ar wedd system ffeiliau'r broses yng ngharchar, ac mae'r gwiriad hwnnw'n perthyn cyn i unrhyw beth gael ei greu o dan /dev.
Yr hyn y mae'r gwerth dychwelyd yn ei wahaniaethu
Mae'r contract a ddogfennir yn gwahanu tri chanlyniad, nid dau: 1 am lwyddiant, -1 pan nad yw'r dull RAND a lwythwyd yn cefnogi'r cais, a 0 am fethiannau eraill, gyda'r esboniad yn cael ei adael i'r ciw gwallau. Mae'r cyfeirnod RAND_bytes yn ychwanegu pwynt hawdd ei anwybyddu: mae'r generadur diofyn yn hadu o'r system weithredu ar blatfformau a gefnogir, a phan fydd y hadu hwnnw'n methu mae'n aros mewn cyflwr gwall yn lle dychwelyd beitiau rhagweladwy.
Dim ond un o'r rhifau hynny sy'n disgrifio'r amgylchedd. Mae -1 yn gwestiwn adeiladu, darparwr neu nodwedd, oherwydd gofynnodd y cod am rywbeth nad yw'r gweithrediad gweithredol yn ei gynnig. Mae 0 gyda chŵyn am hadu yn gwestiwn amgylcheddol, oherwydd ni allai'r generadur gael entropi o gwbl. Nid yw'r rhif ar ei ben ei hun byth yn dweud pa un, ac nid yw enw'r swyddogaeth chwaith.
Pryd y mae nod dyfais gudd yn wir achos
Mae gwasanaeth cyfyngedig yn gweld coeden wahanol i'r gragen rydych chi'n teipio ynddi. Mae carchardai chroot, delweddau cynwysyddion a ffeiliau uned caled eu plwm yn aml yn cyflwyno /dev sy'n dal llai o nodau na'r hyn sydd gan y gwesteiwr. Os yw'r gweithrediad sy'n methu yn agor /dev/urandom yn ôl llwybr, mae'r gwahaniaeth hwnnw'n ddigon i dorri'r cychwyn tra bod y gwesteiwr ei hun yn edrych yn berffaith iach. Nid yw dyfais sy'n bodoli y tu allan i'r carchar yn profi dim am yr hyn y caiff y broses gaeth ei agor.
Nid oes angen llwybr ar bob rhyngwyneb hap, serch hynny. Nid yw galwad system getrandom Linux yn derbyn enw ffeil nac unrhyw ddisgrifydd ffeil, ac mae ei dudalen lawlyfr yn nodi bod y nodwedd hon yn ddefnyddiol yn union lle mae chroot yn cuddio llwybrau dyfeisiau.
Felly mae'r esboniad am y nod coll yn rhagdybiaeth am un gangen o'r cod, nid yn rheol am rifau hap yn gyffredinol. Mae'n dal pan fydd y dystiolaeth yn enwi llwybr, ac mae'n ddyfalu pan fydd y dystiolaeth yn enwi rhywbeth arall.
Darllenwch y ciw gwallau, yna gwedd y broses
Y ffordd gyflymaf i setlo'r cwestiwn yw darllen yr hyn y mae'r llyfrgell eisoes wedi'i gofnodi, ac yna edrych yn syth ar y wedd yng ngharchar. Dechreuwch gyda'r adeilad OpenSSL a lwythodd y gwasanaeth mewn gwirionedd, oherwydd bod staciau darparwyr yn wahanol rhwng prif fersiynau a rhwng dosbarthiadau. Gofynnwch wedyn i systemd pa broses sy'n rhedeg a pha gyfyngiadau sy'n berthnasol iddi. Dim ond ar ôl i'r ddau ffaith fod ar y bwrdd y mae'n werth rhestru'r nodau y gall y broses honno eu gweld.
openssl version -a
systemctl show openvpn-server@lab -p MainPID -p PrivateDevices -p DevicePolicy
pid=$(systemctl show -p MainPID --value openvpn-server@lab)
sudo ls -l /proc/"$pid"/root/dev/urandom /proc/"$pid"/root/dev/random
Rhedwch y darlleniadau hynny yn erbyn yr un broses, nid yn erbyn y gragen sy'n digwydd bod yn agored. Cymharu /dev y gwesteiwr â gwedd proses ddi-gysylltiad yw sut y mae'r dibyniaeth anghywir yn cael ei thrwsio ddwywaith.
Ychwanegwch y dibyniaeth dim ond ar ôl i chi allu ei henwi
Pan fydd y dystiolaeth yn enwi llwybr yn wir, mae'r atgyweiriad yn fach: gwnewch yr un llwybr hwnnw ar gael yng ngharchar a gadewch bopeth arall yn llonydd. Mae bind mount o'r nod sengl fel arfer yn ddigon, ac mae mknod gyda rhifau major a minor safonol y nod yn cynhyrchu'r un canlyniad ar osodiadau lle nad yw mowntio'n opsiwn. Mae ehangu'r sandbox, caniatáu mynediad i bob dyfais nod neu ddiffodd PrivateDevices yn newid cywiriad wedi'i dargedu am regresiad diogelwch parhaol.
Nid yw daemon entropi yn disodli'r atgyweiriad hwnnw. Mae pecynnau fel haveged yn newid sut y maethir pwll y cnewyllyn; ni allant greu llwybr y caiff proses gaeth ei agor. Gall gosod un wneud graff iechyd yn edrych yn well tra bod yr alwad agor yn dal i fethu. Cadwch y ddau broblem ar wahân, neu bydd y methiant nesaf yn cael ei briodoli i'r haen anghywir eto.
Gwiriwch y generadur a'r twnnel ar wahân
Ailgychwyn yw'r unig brawf sy'n ailddefnyddio'r un ffurfweddiad, yr un ffeil uned a'r un cyfyngiad a gynhyrchodd y methiant. Rhedwch ef, yna darllenwch y cofnodion diweddaraf yn y dyddiadur yn hytrach na sampl o gychwyn cynharach.
sudo systemctl restart openvpn-server@lab
sudo journalctl -u openvpn-server@lab --since -5min --no-pager | grep -iE 'rand|entropy|Initialization Sequence'
Chwiliwch am ddau beth ar wahân yn yr allbwn hwnnw: y neges am y ffynhonnell hap yn diflannu, a'r twnnel yn cyrraedd ei garreg filltir gychwyn arferol. Mae generadur sy'n gweithio eto yn dileu un methiant lleol ac yn dweud dim am hunaniaeth y gweinydd, y cymwysterau na'r llwybro. Profwch hynny gyda'r un ffurfweddiad cleient a fethodd o'r blaen, fel bod y canlyniad yn gymharol ac nid yn well yn unig.