Хөгжүүлэгчид үл үзэгдэх кодын өөрчлөлтийг нэвтрүүлэх Trojan Source халдлага

Кембрижийн их сургуулийн судлаачид өөр хоорондоо хянагдсан эх код руу хорлонтой кодыг чимээгүй оруулах аргыг нийтэлжээ. Бэлтгэсэн халдлагын аргыг (CVE-2021-42574) Trojan Source нэрээр танилцуулсан бөгөөд хөрвүүлэгч/тайлбарлагч болон кодыг үзэж буй хүмүүст өөр харагдах текст үүсгэхэд суурилдаг. Аргын жишээг C, C++ (gcc болон clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go болон Python-д зориулсан янз бүрийн хөрвүүлэгч, орчуулагчдад зориулж үзүүлэв.

Энэ арга нь хоёр чиглэлтэй текстийн дэлгэцийн дарааллыг өөрчилдөг кодын тайлбарт тусгай Юникод тэмдэгт ашиглахад суурилдаг. Ийм хяналтын тэмдэгтүүдийн тусламжтайгаар текстийн зарим хэсгийг зүүнээс баруун тийш, бусад хэсгийг баруунаас зүүн тийш харуулах боломжтой. Өдөр тутмын практикт ийм хяналтын тэмдэгтүүдийг жишээлбэл, еврей эсвэл араб хэл дээрх кодын мөрийг файлд оруулахад ашиглаж болно. Гэхдээ хэрэв та өөр өөр текстийн чиглэлтэй мөрүүдийг нэг мөрөнд нэгтгэвэл, заасан тэмдэгтүүдийг ашиглан баруунаас зүүн тийш харуулсан текстийн хэсгүүд нь зүүнээс баруун тийш харуулсан одоо байгаа ердийн тексттэй давхцаж болно.

Энэ аргыг ашигласнаар та кодонд хортой бүтэц нэмж болох боловч кодыг үзэхдээ дараах тайлбарт эсвэл баруунаас зүүн тийш харуулсан үсгийн тэмдэгтүүдийг оруулснаар энэ бүтэцтэй текстийг харагдахгүй болгож болно. хортой оруулга дээр өөр өөр тэмдэгтүүдийг давхарлаж байна. Ийм код нь утгын хувьд зөв хэвээр байх боловч өөрөөр тайлбарлаж, харуулах болно.

Хөгжүүлэгчид үл үзэгдэх кодын өөрчлөлтийг нэвтрүүлэх Trojan Source халдлага

Хөгжүүлэгч кодыг шалгаж байх үед тэмдэгтүүдийн харагдах дараалалтай тулгарах бөгөөд орчин үеийн текст засварлагч, вэб интерфэйс эсвэл IDE дээр сэжигтэй бус тайлбарыг харах боловч хөрвүүлэгч болон тайлбарлагч тэмдэгтүүдийн логик дарааллыг ашиглана. Сэтгэгдэл дэх хоёр чиглэлтэй бичвэрт анхаарал хандуулахгүйгээр хортой оруулгыг байгаагаар нь боловсруул. Асуудал нь янз бүрийн алдартай кодын засварлагчдад (VS Code, Emacs, Atom), түүнчлэн агуулах дахь кодыг үзэх интерфэйсүүдэд (GitHub, Gitlab, BitBucket болон бүх Atlassian бүтээгдэхүүнүүд) нөлөөлдөг.

Хөгжүүлэгчид үл үзэгдэх кодын өөрчлөлтийг нэвтрүүлэх Trojan Source халдлага

Хортой үйлдлүүдийг хэрэгжүүлэхийн тулд аргыг ашиглах хэд хэдэн арга байдаг: далд "буцах" илэрхийлэл нэмэх нь функцийг хугацаанаас нь өмнө дуусгахад хүргэдэг; ихэвчлэн хүчинтэй бүтэц хэлбэрээр харагдах илэрхийллүүдийг тайлбарлах (жишээлбэл, чухал шалгалтыг идэвхгүй болгох); мөрийн баталгаажуулалтын бүтэлгүйтэлд хүргэдэг бусад мөрийн утгуудыг оноох.

Жишээлбэл, халдагч дараах мөрийг агуулсан өөрчлөлтийг санал болгож магадгүй: if access_level != "хэрэглэгч{U+202E} {U+2066}// Админ{U+2069} {U+2066}" { эсэхийг шалгана уу.

Энэ нь хандалтын_level != “хэрэглэгч” { // админ байгаа эсэхийг шалгах интерфэйс дээр харагдах болно.

Нэмж дурдахад, ижил төстэй харагдах боловч утгаараа ялгаатай, өөр өөр юникод кодтой (жишээлбэл, "ɑ" тэмдэгт "тэй төстэй) ижил төстэй тэмдэгтүүдийг ашиглахтай холбоотой халдлагын өөр хувилбарыг (CVE-2021-42694) санал болгосон. a", "ɡ" - "g", "ɩ" - "l"). Хөгжүүлэгчдийг төөрөгдүүлэхийн тулд ижил төстэй тэмдэгтүүдийг зарим хэл дээр функц, хувьсагчийн нэрэнд ашиглаж болно. Жишээлбэл, өөр өөр үйлдлийг гүйцэтгэдэг үл ялгагдах нэртэй хоёр функцийг тодорхойлж болно. Нарийвчилсан дүн шинжилгээ хийхгүй бол эдгээр хоёр функцын аль нь тодорхой газар дуудагдах нь тодорхойгүй байна.

Хөгжүүлэгчид үл үзэгдэх кодын өөрчлөлтийг нэвтрүүлэх Trojan Source халдлага

Аюулгүй байдлын үүднээс юникод тэмдэгтүүдийг дэмждэг хөрвүүлэгч, орчуулагч болон угсралтын хэрэгсэлд тайлбар, стринг литерал эсвэл гаралтын чиглэлийг өөрчилдөг танигч тэмдэгтүүд хослогдоогүй тохиолдолд алдаа эсвэл анхааруулга харуулахыг зөвлөж байна (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E болон U+200F). Ийм тэмдэгтүүдийг програмчлалын хэлний техникийн үзүүлэлтүүдэд шууд хориглох ёстой бөгөөд код засварлагч болон репозиторын интерфейсийг хүндэтгэх ёстой.

Нэмэлт 1: GCC, LLVM/Clang, Rust, Go, Python болон binutils-д зориулсан эмзэг байдлын засваруудыг бэлтгэсэн. GitHub, Bitbucket, Jira нар мөн асуудлыг зассан. GitLab-д зориулсан засвар хийгдэж байна. Асуудалтай кодыг тодорхойлохын тулд дараах тушаалыг ашиглахыг зөвлөж байна: grep -r $'[\u061C\u200E\u200F\u202A\u202C\u202D\u202E\u202\u2066\u2067\u2068\u2069\uXNUMX\uXNUMX]' эх сурвалж

Нэмэлт 2: Plan 9 үйлдлийн систем болон Go програмчлалын хэлийг бүтээгчдийн нэг Расс Кокс эрт дээр үеэс мэдэгдэж байсан (Go, Rust, C++, Ruby) тайлбарласан халдлагын аргад хэт их анхаарал хандуулж, нухацтай авч үзээгүйг шүүмжилсэн. . Коксын хэлснээр асуудал нь голчлон код засварлагч болон вэб интерфэйс дэх мэдээллийг зөв харуулахтай холбоотой бөгөөд үүнийг шалгах явцад зөв хэрэгсэл, код анализатор ашиглан шийдэж болно. Тиймээс таамаглалын халдлагад анхаарлаа хандуулахын оронд код болон хараат байдлыг шалгах үйл явцыг сайжруулахад анхаарлаа хандуулах нь илүү тохиромжтой байх болно.

Рас Кокс мөн хөрвүүлэгчид нь асуудлыг засах зөв газар биш гэж үзэж байна, учир нь хөрвүүлэгчийн түвшинд аюултай тэмдэгтүүдийг хориглосноор эдгээр тэмдэгтүүдийг ашиглахыг зөвшөөрч болохуйц асар том хэрэгсэл хэвээр байна, тухайлбал бүтээх систем, ассемблер, багц менежерүүд болон төрөл бүрийн тохиргооны задлагч болон өгөгдөл. Үүний жишээ болгон хөрвүүлэгчид LTR/RTL кодыг боловсруулахыг хориглосон Rust төслийг өгсөн боловч Cargo багц менежерт засвар оруулаагүй бөгөөд Cargo.toml файлаар дамжуулан ижил төстэй халдлага хийхийг зөвшөөрдөг. Үүний нэгэн адил BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml болон requirements.txt зэрэг файлууд халдлагын эх үүсвэр болж чаддаг.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх