wdckit
Triggered rules
source_untrusted_domain
One or more source=() URLs point to a host outside the trusted allowlist (github.com, gitlab.com, codeberg.org, pypi.org, …).
-
PKGBUILD:16
source=("https://s3.e2e4.ru/k0ste/pkgbuild/${pkgname}-${pkgver}.zip")
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads a prebuilt binary (wdckit, a Western Digital CLI utility) from s3.e2e4.ru/k0ste/, which is a personal/third-party S3 bucket operated by the maintainer, not an official Western Digital distribution channel. The comment acknowledges the official source is behind a Cloudflare challenge (hddguru.com), so the maintainer is re-hosting the binary themselves. This is a classic supply-chain concern: a closed-source, prebuilt x86_64/aarch64 binary is fetched from an unofficial host controlled by a single individual. There is a sha256sum check, which provides some integrity guarantee, but does not protect against the host owner substituting the file and updating the checksum in the PKGBUILD. The binary is then directly installed to /opt/wdc/wdckit and executed paths are set up. This pattern — unofficial re-hosting of a proprietary prebuilt binary — is a genuine medium-severity supply-chain risk, consistent with the original rating.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Konstantin Shalygin <k0ste@k0ste.ru>
# Contributor: Konstantin Shalygin <k0ste@k0ste.ru>
pkgname='wdckit'
_path="opt/wdc/${pkgname}"
pkgver='3.3.1.0'
pkgrel='1'
pkgdesc="Western Digital ATA/SCSI command line utility"
url='https://westerndigital.com/'
license=('custom')
arch=('x86_64' 'aarch64')
makedepends=('libarchive')
# Source file is covered with Cloudflare challenge
# https://files.hddguru.com/index.php?action=downloadfile&filename=wdckit-3.3.1.0.zip&directory=Software/Western%20Digital&
source=("https://s3.e2e4.ru/k0ste/pkgbuild/${pkgname}-${pkgver}.zip")
sha256sums=('541c2ed48dd6e6ddc7e5a2c9dd292cb4108392bd02bca3d5be2ff6057b316e3a')
_file_arch=$([[ "${CARCH}" == 'x86_64' ]] && echo -n "${pkgname}-${pkgver}-${CARCH}-rpm" || echo -n "${pkgname}-${pkgver}-${CARCH}_deb")
_pkg_arch=$([[ "${CARCH}" == 'x86_64' ]] && echo -n "${pkgname}-${pkgver}.${CARCH}.rpm" || echo -n "${pkgname}_${pkgver}_${CARCH}.deb")
prepare() {
mkdir "${_file_arch}" "${pkgname}-pkgsource"
# Unpack zip with packages
bsdtar -xf "${_file_arch}.zip" --directory "${_file_arch}"
# Unpack package
bsdtar -xf "${_file_arch}/${_pkg_arch}" --directory "${pkgname}-pkgsource"
}
build() {
cd "${pkgname}-pkgsource"
# trick ported from original package
echo "1" > "${_path}/.${pkgname}_lic"
touch "${_path}/.exit_codes.txt"
}
package() {
cd "${pkgname}-pkgsource"
install -Dm0755 "${_path}/man/${pkgname}.1.gz" -t "${pkgdir}/usr/share/man/man1"
rm --force --recursive "${_path}/man"
cp --recursive "usr" "${pkgdir}"
cp --recursive "opt" "${pkgdir}"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 2 |
| 2026-08-02 00:16:08 | MEDIUM | 2 |
| 2026-08-01 00:11:18 | MEDIUM | 2 |
| 2026-07-31 00:14:10 | MEDIUM | 2 |
| 2026-07-30 00:17:23 | MEDIUM | 2 |
| 2026-07-29 00:25:53 | MEDIUM | 2 |
| 2026-07-28 00:07:28 | MEDIUM | 2 |
| 2026-07-27 00:24:32 | MEDIUM | 2 |
| 2026-07-26 00:07:32 | MEDIUM | 2 |
| 2026-07-25 00:13:44 | MEDIUM | 2 |
| 2026-07-24 00:02:28 | MEDIUM | 2 |
| 2026-07-23 00:14:47 | MEDIUM | 2 |
| 2026-07-22 00:29:32 | MEDIUM | 2 |
| 2026-07-21 00:24:15 | MEDIUM | 2 |
| 2026-07-20 00:19:49 | MEDIUM | 2 |
| 2026-07-19 00:17:08 | MEDIUM | 2 |
| 2026-07-18 00:14:48 | MEDIUM | 2 |
| 2026-07-17 00:06:16 | MEDIUM | 2 |
| 2026-07-16 00:05:41 | MEDIUM | 2 |
| 2026-07-15 00:09:25 | MEDIUM | 2 |