aur-malware-check

Detection and analysis tools for the atomic-lockfile supply-chain attack on the Arch User Repository (AUR), generalized to a campaign-based architecture that handles multiple concurrent and historical attack waves (CHAOS RAT 2025, Russian spam packages, and future campaigns declared via campaigns.json).

簡單的說,有人把惡意代碼放到 AUR 已經沒維護的套件裏面,然後上傳 。所以安裝了以後,就被惡意代碼植入了,也因為是 npm 套件的關係,相依性相對複雜,影響層面也較為廣泛。

社群因應此狀況,開了一個 repository 放檢測腳本:https://github.com/lenucksi/aur-malware-check

使用方法如下

# 安裝 uv
pacman -S uv

# 下載代碼
git clone https://github.com/lenucksi/aur-malware-check.git

# 進入目錄
cd aur-malware-check

# 建立 python venv 環境,並安裝模組
uv sync

# 執行
uv run python -m aur_check --refresh --list

其他使用方法可以參考 repository README.md 裡的 quickstart

如果發現了被植入惡意代碼,可以參考 repository 裡的 What to do If I Infected

  • 保留系統:不要關機,改用可信媒體進行鑑識擷取。
  • 重設所有憑證:Discord、GitHub、npm、Slack、Teams、SSH 金鑰、Vault token、雲端供應商金鑰。
  • 檢查持久化:systemctl list-units --type=service --state=running(查看是否有不明服務)。
  • 檢查 eBPF rootkit:ls -la /sys/fs/bpf/hidden_*
  • 使用可信媒體清理:從 Arch ISO 開機,掛載檔案系統,移除惡意的 systemd 單元。
  • 考慮重裝:rootkit 會讓系統失去可信度。
  • 回報發現:https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/

容器平台複製檔案

oc/kubectl 指令提供了方便的 cp ,可以把檔案複製到容器內,或是把容器內的檔案複製出來,但這需要容器內有 tar 指令配合才行。

若沒有的話,可以用 exec 來替代,技巧是利用 cat 的 stdin ,例如下面這行可以把檔案從 host 端複製到容器內部。

cat local.file | oc exec -i <pod> -- sh -c "cat > /target/path/remote.file"

反之,可以用 cat

oc exec -i <pod> -- sh -c "cat some_file" > /target/path/remote.file"

UxPlay

之前是使用 RPiPlay ,讓家裡的 linux 桌機可以當作 Macbook Pro 的螢幕鏡像輸出。

去年電腦重灌,忘了裝上去,今年看的時候,發現 RPiPlay 停滯了,改推薦 uxplay 。上網找了文章,看介紹:

安裝方法可參考官方文件:https://github.com/antimof/UxPlay#running-uxplay

在 Ubuntu 24.04 已經內建,所以用 apt 就可以輕鬆安裝

sudo apt install uxplay

使用上很簡單,執行 uxplay 就可以。

uxplay

但我遇到偶爾會有畫面出不來的情況,上網查,說要調整輸出

這邊我是新增了 ~/.config/uxplayrc ,放入以下內容。

vs "autovideosink"
as 0

再重新啟動 uxplay

後續為了方便使用,我是把 uxplay 放到登入自動啟動的設定裡。

Archlinux上的postgresql升級

官方有說明,依照說明進行就可以:https://wiki.archlinux.org/title/PostgreSQL#Upgrading_PostgreSQL

但,我太久沒去注意,所以依照程序進行時,發現我舊的資料庫是 16,目前版本是 18。升級程序需要舊的 16 的檔案才可以,所以這邊紀錄過程:

取得資料庫檔案所使用的版本

cat /var/lib/postgres/data/PG_VERSION

    停止服務

    因為是服務無法啟動才發現 postgresql 需要升級,所以就不需要停止服務。

    安裝新版的檔案

    這步驟也跳過了,因為每次都是全機升級,所以已經安裝好了。

    搬移檔案

    主要是把原來的 /var/lib/postgres/data 更名,並建立新的資料目錄。

    sudo mv /var/lib/postgres/data /var/lib/postgres/olddata
    sudo mkdir /var/lib/postgres/data /var/lib/postgres/tmp
    sudo chown postgres:postgres /var/lib/postgres/data /var/lib/postgres/tmp

    改用 postgres 使用者身份建立資料庫

    sudo -u postgres -H /bin/bash
    cd /var/lib/postgres/tmp
    initdb -D /var/lib/postgres/data --locale=C.UTF-8 --encoding=UTF8 --data-checksums

    升級

    一樣是 postgres 使用者身份,執行 pg_upgrade 來升級

    pg_upgrade -b /opt/pgsql-16/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data

    我是在這步驟出錯的,因為我已經升級到 18。 /opt/pgsql-16/bin 這個目錄是安裝 postgresql-old-upgrade 套件才會有的,通常安裝了 postgresql 18,postgresql-old-upgrade 裡面的檔案就是 /opt/pgsql-17/bin

    參考了 Grok 的回答,對 postgresql-old-upgrade 進行降級了,先到 https://archive.archlinux.org/packages/p/postgresql-old-upgrade/ 下載舊版的檔案 postgresql-old-upgrade-16.10-1-x86_64.pkg.tar.zst ,然後安裝

    sudo pacman -U postgresql-old-upgrade-16.10-1-x86_64.pkg.tar.zst

    再次執行 pg_upgrade,會發現有以下錯誤

    error while loading shared libraries: libicui18n.so.76
    error while loading shared libraries: libicuuc.so.76

    只能再次安裝 icu76,Grok 說可以用 yay 安裝,此時要離開 postgres 身份來安裝。

    yay -Ss icu76

    安裝後,再次切換為 postgres 使用者帳號執行 pg_upgrade,這時候是說少了 libLLVM.so.20.1。又再離開 postgres 身份,用以下指令安裝 llvm 20

    yay -Syu llvm20

    再切換為 postgres 身份,執行 pg_upgrade,就順利完成了。

    啟動服務

    執行 exit 離開 postgres 身份,檢查以下檔案,主要是跟之前 /var/lib/postgres/olddata 目錄下的做比對。

    /var/lib/postgres/data/postgresql.conf
    /var/lib/postgres/data/pg_hba.conf

    設定改好以後,啟動 postgresql 服務。

    sudo systemctl start postgresql

    清理

    切換為 postgres 身份,執行清理

    /usr/bin/vacuumdb --all --analyze-in-stages --missing-stats-only
    /usr/bin/vacuumdb --all --analyze-only
    

    依照升級後的指令,執行

    ./delete_old_cluster.sh

    刪除 olddata 跟 tmp

    sudo rm -rf /var/lib/postgres/olddata
    sudo rm -rf /var/lib/postgres/tmp

    至此,大功告成。

    Proxmox LXC設定

    LXC是輕量級的容器,Proxmox 直接提供了這功能,等於是可以拿 LXC 來當 VM,這樣可以更壓榨硬體的效能出來。

    這邊主要是紀錄用的時候遇到的一些狀況:

    1. Tailscale
    2. podman

    Tailscale

    因為我 Proxmox 網路設定是用NAT,再加上沒有第二張網卡,所以就簡單用 Tailscale 讓外部可以連到 Proxmox 裡面的 LXC 跟 VM。VM 用 tailscale 沒什麼問題,但 LXC 就遇到不能用的情況。

    這邊要在 lxc 容器設定 (Proxmox 主機裡的 /etc/pve/lxc/<id>.conf 裡加上以下內容

    lxc.cgroup2.devices.allow: c 10:200 rwm
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

    podman

    podman 本身就容器,等於是容器裡的容器,這邊要處理 rootless 的情況,一樣,在 lxc 容器設定 (Proxmox 主機裡的 /etc/pve/lxc/<id>.conf 加上以下內容

    lxc.idmap: u 0 100000 165536
    lxc.idmap: g 0 100000 165536
    

    還有 /etc/subuid

    root:100000:200000

    /etc/subgid

    root:100000:200000

    參考資料

    helm images

    適用情境,客戶是離線環境,沒辦法直接拉 container image,所以要先知道 helm chart 裏面用到的 container image,用這指令,就可以找到所有 helm chart 所使用到的 image,再用 skopeo/podman pull/docker pull 拉取下來,存為 tarball ,並帶到客戶端。

    專案網址:https://github.com/nikhilsbhat/helm-images

    安裝

    安裝好 helm 以後,可以用以下指令安裝

    helm plugin install https://github.com/nikhilsbhat/helm-images

    使用

    簡單說,就是拿 helm install 的指令來用,並改為 helm images get。

    所以在配置好 helm repo 以後,就可以用 helm images 取得

    例如 redis-operator

    helm images get redis redis-operator/redis-operator

    又例如 zabbix operator

    helm images get zabbix zabbix-chart-7.0/zabbix-helm-chrt

    就可以取得 container images 的網址。


    題外話,應該要來熟悉一下 skopeo 怎麼用才是。

    使用systemctl 啟用podman出現Failed to connect to bus

    在使用 sudo/su 切換身份以後,用以下指令去啟用/啟動 podman 服務,會出現以下錯誤

    Failed to connect to bus: No such file or directory

    查了以後,才知道是少了 DBUS 環境變數的問題:https://stackoverflow.com/questions/73814619/permission-denied-trying-to-use-rootless-podman-docker-compose-traefik-with

    這個時候,只要查到 DBUS 的 socket 路徑,再去 export DBUS 環境變數即可

    export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
    $ systemctl --user enable --now podman

    啟用以後,會有 podman.sock 檔案,這個檔案的位置跟 root 身份的位置不一樣,會是在

    /run/user/$UID/podman/podman.sock

    這邊是要特別注意的。

    如何使用podman volume掛載nfs分享

    資料來源:Mount an NFS Share Using a Rootful Podman Volume (oracle.com)

    在建立 volume 時,就可以指定 nfs 的資訊

    sudo podman volume create --opt type=nfs --opt o=rw --opt device=10.0.0.150:/nfs-share nfsvol

    在建立完成後,podman 會去掛載 nfs 分享,這部份可以使用 mount 查看到掛載到哪個資料夾。接下來 podman 就可以使用 -v 參數,去指定要使用剛剛建立的 volume ,容器啟動後,就可以使用了。

    例如

    sudo podman run -v nfsvol:/foo -it --rm oraclelinux:9 ls -al /foo

    這就表示把建立好的 nfsvol ,掛載到容器裡面的 /foo ,應用程式就可以存取到了。

    為 yum repository 指定 proxy

    要設定讓 yum 可以使用指定的 proxy 伺服器,可以在 /etc/yum.conf 的 [main] 區段裡增加 proxy 設定即可

    [main]
    proxy=http://<proxy_server>:3128

    那如果是個別的 repository 要使用不同的 proxy 伺服器,可以怎麼做呢?
    原本以為會很麻煩的,但意想不到簡單,因為有支援此設定。
    就在 repository 的區段裡增加 proxy 設定就可以:

    [repo]
    name=baseos
    baseurl=http://yumrepo.example.com/baseos
    enabled=1
    gpgcheck=0
    proxy=http://<proxy_server>:3128

    參考資料