opera-developer
The package installs a setuid binary (opera_sandbox) as part of Opera's normal sandboxing mechanism, which is expected behavior for the browser and not inherently malicious.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The package installs a setuid binary (opera_sandbox) as part of Opera's normal sandboxing mechanism, which is expected behavior for the browser and not inherently malicious.
1 higher static finding superseded - not the current verdict (shown for transparency)
privileged_install
The package grants elevated privileges or installs an update path outside pacman: a /etc/sudoers.d rule (often passwordless), a setuid/setgid binary, or a self-update script/service that can fetch and run future code with no checksum verification. The initial install may be verified, but the ongoing privilege + update surface is a real supply-chain / privilege-escalation risk.
-
PKGBUILD:172
chmod 4755 \
PKGBUILD
1 offending line(s) highlighted# Maintainer: MojArch
pkgname=opera-developer
pkgver=137.0.6015.0
pkgrel=1
pkgdesc='Fast, secure, easy-to-use web browser (Developer Stream)'
arch=('x86_64')
url='https://www.opera.com/computer'
license=('LicenseRef-opera')
options=(!strip !debug !zipman)
backup=('etc/opera-developer/default')
provides=(
'opera-developer-browser'
)
conflicts=(
'opera-developer-ffmpeg-codecs-bin'
)
replaces=(
'opera-developer-ffmpeg-codecs-bin'
)
depends=(
'alsa-lib'
'at-spi2-core'
'cairo'
'cups'
'curl'
'dbus'
'expat'
'gcc-libs'
'glib2'
'glibc'
'gtk3'
'hicolor-icon-theme'
'libnotify'
'libx11'
'libxcb'
'libxcomposite'
'libxdamage'
'libxext'
'libxfixes'
'libxkbcommon'
'libxrandr'
'libxss'
'mesa'
'nspr'
'nss'
'pango'
'systemd-libs'
'ttf-font'
'xdg-utils'
)
optdepends=(
'qt5-base: Qt5 integration'
'qt6-base: Qt6 integration'
'egl-gbm'
'upower'
)
_nwjs_ffmpeg_version=0.115.0
_upstream_deb_pkg='opera-developer'
_debfile="${_upstream_deb_pkg}_${pkgver}_amd64.deb"
_deburl="https://get.opera.com/pub/opera-developer/${pkgver}/linux/${_debfile}"
_ffmpeg_zip="${_nwjs_ffmpeg_version}-linux-x64.zip"
source=(
"${_deburl}"
"opera"
"default"
"nwjs-ffmpeg-${_ffmpeg_zip}::https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/${_nwjs_ffmpeg_version}/${_ffmpeg_zip}"
)
sha256sums=('238ea996dc3ed283ffbd390022dd22c840aa1e0a871b172bc94f55f78e6b026f'
'508512464e24126fddfb2c41a1e2e86624bdb0c0748084b6a922573b6cf6b9c5'
'99fc0d2822edd14e234d451995db47148125e4580221a292598959421d131231'
'589fc1fa3f9905fe336990a2c8e16a9107c1aabdb42031b69eaf812331e5fb4a')
prepare() {
sed -e 's|%pkgname%|opera-developer|g' \
-e 's|%operabin%|opera-developer/opera-developer|g' \
-i "$srcdir/opera"
sed -e 's|%pkgname%|opera-developer|g' \
-i "$srcdir/default"
}
package() {
cd "$srcdir"
# Extract upstream package
bsdtar -xf "$_debfile"
# Debian packages may use xz, zstd, or another supported compressor for
# their data member. Do not assume the historical data.tar.xz name.
local data_archive
data_archive="$(find "$srcdir" \
-maxdepth 1 \
-type f \
-name 'data.tar.*' \
-print -quit)"
if [[ -z "$data_archive" ]]; then
echo "ERROR: data archive not found in $_debfile"
return 1
fi
bsdtar -xf "$data_archive" \
--exclude='usr/share/lintian' \
--exclude='usr/share/menu' \
-C "$pkgdir"
# Normalize multiarch library layout
local libroot="$pkgdir/usr/lib"
local multiarch_dir
multiarch_dir="$(find "$libroot" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-name '*-linux-gnu' \
| head -n1)"
if [[ -z "$multiarch_dir" ]]; then
echo 'ERROR: multiarch library directory not found'
return 1
fi
local upstream_libdir
upstream_libdir="$(find "$multiarch_dir" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-name 'opera-developer' \
| head -n1)"
if [[ -z "$upstream_libdir" ]]; then
echo 'ERROR: upstream Opera payload directory not found'
return 1
fi
rm -rf "$libroot/opera-developer"
mv "$upstream_libdir" \
"$libroot/opera-developer"
rm -rf "$multiarch_dir"
# Replace FFmpeg
bsdtar -xf "nwjs-ffmpeg-${_ffmpeg_zip}"
local ffmpeg_so
ffmpeg_so="$(find "$srcdir" \
-type f \
-name 'libffmpeg.so' \
| head -n1)"
if [[ -z "$ffmpeg_so" ]]; then
echo "ERROR: libffmpeg.so not found in $_ffmpeg_zip"
return 1
fi
rm -f "$pkgdir/usr/lib/opera-developer/libffmpeg.so"
install -Dm755 "$ffmpeg_so" \
"$pkgdir/usr/lib/opera-developer/libffmpeg.so"
# Sandbox
if [[ -f "$pkgdir/usr/lib/opera-developer/opera_sandbox" ]]; then
chmod 4755 \
"$pkgdir/usr/lib/opera-developer/opera_sandbox"
fi
# Defaults
install -Dm644 "$srcdir/default" \
"$pkgdir/etc/opera-developer/default"
# Launcher
local upstream_binary
upstream_binary="$(find "$pkgdir/usr/lib/opera-developer" \
-maxdepth 1 \
-type f \
\( -name 'opera-developer' -o -name 'opera' \) \
| head -n1)"
if [[ -z "$upstream_binary" ]]; then
echo 'ERROR: upstream Opera executable not found'
return 1
fi
rm -f "$pkgdir/usr/bin/opera-developer"
install -Dm755 "$srcdir/opera" \
"$pkgdir/usr/bin/opera-developer"
# Desktop entries
local desktop_dir="$pkgdir/usr/share/applications"
if [[ -d "$desktop_dir" ]]; then
find "$desktop_dir" \
-maxdepth 1 \
-type f \
-name '*.desktop' \
-print0 |
while IFS= read -r -d '' desktop_file; do
if grep -qi 'opera' "$desktop_file"; then
sed -i \
-e 's|^Exec=.*|Exec=opera-developer %U|' \
-e 's|^TryExec=.*|TryExec=opera-developer|' \
"$desktop_file"
fi
done
fi
# License
local copyright_file
copyright_file="$(find "$pkgdir/usr/share/doc" \
-type f \
-name copyright \
| head -n1)"
if [[ -n "$copyright_file" ]]; then
install -Dm644 "$copyright_file" \
"$pkgdir/usr/share/licenses/$pkgname/copyright"
fi
}
Changes since previous scan
--- PKGBUILD @ 2026-09-12 00:25+++ PKGBUILD @ 2026-09-17 00:27@@ -1,7 +1,7 @@ # Maintainer: MojArch pkgname=opera-developer-pkgver=137.0.6010.1+pkgver=137.0.6015.0 pkgrel=1 pkgdesc='Fast, secure, easy-to-use web browser (Developer Stream)' arch=('x86_64')@@ -71,7 +71,7 @@ "nwjs-ffmpeg-${_ffmpeg_zip}::https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/${_nwjs_ffmpeg_version}/${_ffmpeg_zip}" ) -sha256sums=('06739eac180d730f67c715fb6c1b575c29c0cede04dbae47c1865414733fd6f0'+sha256sums=('238ea996dc3ed283ffbd390022dd22c840aa1e0a871b172bc94f55f78e6b026f' '508512464e24126fddfb2c41a1e2e86624bdb0c0748084b6a922573b6cf6b9c5' '99fc0d2822edd14e234d451995db47148125e4580221a292598959421d131231' '589fc1fa3f9905fe336990a2c8e16a9107c1aabdb42031b69eaf812331e5fb4a')Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Low | 2 |
| 2026-09-16 00:03:17 | Low | 2 |
| 2026-09-15 00:25:31 | Low | 2 |
| 2026-09-14 00:27:57 | Low | 2 |
| 2026-09-13 00:19:54 | Low | 2 |
| 2026-09-12 05:10:45 | Medium | 1 |
| 2026-09-12 00:25:17 | Low | 2 |
| 2026-09-11 00:19:22 | Low | 2 |
| 2026-09-10 00:22:44 | Low | 2 |
| 2026-09-09 00:04:09 | Low | 2 |
| 2026-09-08 00:18:08 | Low | 2 |
| 2026-09-07 11:14:32 | Medium | 1 |
| 2026-09-07 00:30:15 | Low | 2 |
| 2026-09-06 00:17:06 | Low | 2 |
| 2026-09-05 00:16:27 | Low | 2 |
| 2026-09-04 00:03:13 | Low | 2 |
| 2026-09-03 00:15:47 | Low | 2 |
| 2026-09-02 00:02:31 | Low | 2 |
| 2026-09-01 00:11:19 | Low | 2 |
| 2026-08-31 00:19:57 | Low | 2 |