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=140.0.6066.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.119.2
_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=('802426b60a4666523f223e7e8204a93843d781239bfdba6a81b66f3f2af174cc'
'508512464e24126fddfb2c41a1e2e86624bdb0c0748084b6a922573b6cf6b9c5'
'99fc0d2822edd14e234d451995db47148125e4580221a292598959421d131231'
'0d543f2a5429eabcd43bdb5c46c89958446ab9875350830d04492b1ad7411f1d')
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-10-29 00:13+++ PKGBUILD @ 2026-11-01 00:21@@ -1,7 +1,7 @@ # Maintainer: MojArch pkgname=opera-developer-pkgver=139.0.6051.0+pkgver=140.0.6066.0 pkgrel=1 pkgdesc='Fast, secure, easy-to-use web browser (Developer Stream)' arch=('x86_64')@@ -58,7 +58,7 @@ 'upower' ) -_nwjs_ffmpeg_version=0.118.0+_nwjs_ffmpeg_version=0.119.2 _upstream_deb_pkg='opera-developer' _debfile="${_upstream_deb_pkg}_${pkgver}_amd64.deb" _deburl="https://get.opera.com/pub/opera-developer/${pkgver}/linux/${_debfile}"@@ -71,10 +71,10 @@ "nwjs-ffmpeg-${_ffmpeg_zip}::https://github.com/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases/download/${_nwjs_ffmpeg_version}/${_ffmpeg_zip}" ) -sha256sums=('80fe07a036da011dd6fe061e73ea11569a15174a735a9047460d31d4795f2f6f'+sha256sums=('802426b60a4666523f223e7e8204a93843d781239bfdba6a81b66f3f2af174cc' '508512464e24126fddfb2c41a1e2e86624bdb0c0748084b6a922573b6cf6b9c5' '99fc0d2822edd14e234d451995db47148125e4580221a292598959421d131231'- '826a715d5b93585657f7a6eea441f5f23c9c10c60692b9ddf69495ce4d15ed2f')+ '0d543f2a5429eabcd43bdb5c46c89958446ab9875350830d04492b1ad7411f1d') prepare() { sed -e 's|%pkgname%|opera-developer|g' \Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Low | 2 |
| 2026-10-31 00:07:41 | Low | 2 |
| 2026-10-30 00:29:30 | Low | 2 |
| 2026-10-29 13:52:19 | Medium | 1 |
| 2026-10-29 00:13:55 | Medium | 2 |
| 2026-10-28 00:06:54 | Medium | 2 |
| 2026-10-27 00:23:28 | Medium | 2 |
| 2026-10-26 00:12:40 | Medium | 2 |
| 2026-10-25 00:20:48 | Medium | 2 |
| 2026-10-24 00:14:55 | Medium | 2 |
| 2026-10-23 00:02:19 | Medium | 2 |
| 2026-10-22 00:13:10 | Medium | 2 |
| 2026-10-21 00:12:50 | Medium | 2 |
| 2026-10-20 13:28:00 | Medium | 2 |
| 2026-10-20 00:10:31 | Low | 2 |
| 2026-10-19 00:03:55 | Low | 2 |
| 2026-10-18 00:06:55 | Low | 2 |
| 2026-10-17 00:21:55 | Low | 2 |
| 2026-10-16 00:12:47 | Low | 2 |
| 2026-10-15 00:28:05 | Low | 2 |