Audit #16 Benign
Show full summary
Clean — no supply-chain anomaly. Full git-level audit of ilab-media-tools (Media Cloud by interfacelab) covering all 162 published versions back to 2016-07. Single committer for 8 years, zero detection events, zero IOC matches, zero suspicious patterns in plugin-own code. The 58 code-scan findings on current trunk are all in vendored dependencies (Symfony, AWS SDK, Google Cloud, Firebase JWT, Carbon, ShortPixel) and are well-known legitimate uses. No further action required.
Audit retained for the record. No action required.
Plugins under the same committer's SVN access
interfacelab holds push access to 1 plugin totalling 7k+ active installs.
Plugin version history
Every release on wp.org for this plugin, color-coded by relationship to the incident. The compromise window shows where the wp.org Plugin Review Team deleted the malicious tags from SVN — those versions cannot be re-downloaded today.
-
1.0.0Last clean Last clean release before incident -
1.0.1PRT cleanup PRT cleanup release — incident closed -
1.0.2Clean Clean (post-cleanup) -
1.0.3Clean Clean (post-cleanup) -
1.0.4Clean Clean (post-cleanup) -
1.0.5Clean Clean (post-cleanup) -
1.0.8Clean Clean (post-cleanup) -
1.0.9Clean Clean (post-cleanup) -
1.1.0Clean Clean (post-cleanup) -
1.1.1Clean Clean (post-cleanup) -
1.2Clean Clean (post-cleanup) -
1.2.1Clean Clean (post-cleanup) -
1.2.2Clean Clean (post-cleanup) -
1.2.3Clean Clean (post-cleanup) -
1.4.1Clean Clean (post-cleanup) -
1.4.2Clean Clean (post-cleanup) -
1.4.3Clean Clean (post-cleanup) -
1.4.4Clean Clean (post-cleanup) -
1.4.5Clean Clean (post-cleanup) -
1.4.6Clean Clean (post-cleanup) -
1.4.7Clean Clean (post-cleanup) -
1.4.8Clean Clean (post-cleanup) -
1.4.9Clean Clean (post-cleanup) -
1.5.0Clean Clean (post-cleanup) -
1.5.1Clean Clean (post-cleanup) -
1.5.2Clean Clean (post-cleanup) -
1.5.3Clean Clean (post-cleanup) -
2.0.1Clean Clean (post-cleanup) -
2.0.2Clean Clean (post-cleanup) -
2.0.3Clean Clean (post-cleanup) -
2.0.4Clean Clean (post-cleanup) -
2.0.5Clean Clean (post-cleanup) -
2.0.6Clean Clean (post-cleanup) -
2.0.7Clean Clean (post-cleanup) -
2.0.8Clean Clean (post-cleanup) -
2.0.9Clean Clean (post-cleanup) -
2.1.0Clean Clean (post-cleanup) -
2.1.4Clean Clean (post-cleanup) -
2.1.5Clean Clean (post-cleanup) -
2.1.6Clean Clean (post-cleanup) -
2.1.7Clean Clean (post-cleanup) -
2.1.8Clean Clean (post-cleanup) -
2.1.9Clean Clean (post-cleanup) -
2.1.10Clean Clean (post-cleanup) -
2.1.11Clean Clean (post-cleanup) -
2.1.14Clean Clean (post-cleanup) -
2.1.15Clean Clean (post-cleanup) -
2.1.16Clean Clean (post-cleanup) -
2.1.17Clean Clean (post-cleanup) -
2.1.18Clean Clean (post-cleanup) -
2.1.19Clean Clean (post-cleanup) -
2.1.20Clean Clean (post-cleanup) -
2.1.21Clean Clean (post-cleanup) -
2.1.22Clean Clean (post-cleanup) -
2.1.23Clean Clean (post-cleanup) -
2.1.30Clean Clean (post-cleanup) -
3.0.7Clean Clean (post-cleanup) -
3.0.8Clean Clean (post-cleanup) -
3.0.9Clean Clean (post-cleanup) -
3.1.0Clean Clean (post-cleanup) -
3.1.1Clean Clean (post-cleanup) -
3.1.2Clean Clean (post-cleanup) -
3.1.5Clean Clean (post-cleanup) -
3.1.6Clean Clean (post-cleanup) -
3.1.7Clean Clean (post-cleanup) -
3.2.0Clean Clean (post-cleanup) -
3.2.1Clean Clean (post-cleanup) -
3.2.2Clean Clean (post-cleanup) -
3.2.3Clean Clean (post-cleanup) -
3.2.4Clean Clean (post-cleanup) -
3.2.5Clean Clean (post-cleanup) -
3.2.6Clean Clean (post-cleanup) -
3.2.7Clean Clean (post-cleanup) -
3.3.0Clean Clean (post-cleanup) -
3.3.1Clean Clean (post-cleanup) -
3.3.2Clean Clean (post-cleanup) -
3.3.3Clean Clean (post-cleanup) -
3.3.4Clean Clean (post-cleanup) -
3.3.5Clean Clean (post-cleanup) -
3.3.6Clean Clean (post-cleanup) -
3.3.7Clean Clean (post-cleanup) -
3.3.8Clean Clean (post-cleanup) -
3.3.9Clean Clean (post-cleanup) -
3.3.10Clean Clean (post-cleanup) -
3.3.11Clean Clean (post-cleanup) -
3.3.12Clean Clean (post-cleanup) -
3.3.14Clean Clean (post-cleanup) -
3.3.18Clean Clean (post-cleanup) -
3.3.19Clean Clean (post-cleanup) -
3.3.20Clean Clean (post-cleanup) -
3.3.21Clean Clean (post-cleanup) -
4.0.2Clean Clean (post-cleanup) -
4.0.3Clean Clean (post-cleanup) -
4.0.5Clean Clean (post-cleanup) -
4.0.6Clean Clean (post-cleanup) -
4.0.7Clean Clean (post-cleanup) -
4.0.11Clean Clean (post-cleanup) -
4.1.0Clean Clean (post-cleanup) -
4.1.1Clean Clean (post-cleanup) -
4.1.4Clean Clean (post-cleanup) -
4.1.5Clean Clean (post-cleanup) -
4.1.6Clean Clean (post-cleanup) -
4.1.7Clean Clean (post-cleanup) -
4.1.8Clean Clean (post-cleanup) -
4.1.9Clean Clean (post-cleanup) -
4.1.12Clean Clean (post-cleanup) -
4.1.14Clean Clean (post-cleanup) -
4.2.0Clean Clean (post-cleanup) -
4.2.1Clean Clean (post-cleanup) -
4.2.2Clean Clean (post-cleanup) -
4.2.3Clean Clean (post-cleanup) -
4.2.6Clean Clean (post-cleanup) -
4.2.7Clean Clean (post-cleanup) -
4.2.8Clean Clean (post-cleanup) -
4.2.9Clean Clean (post-cleanup) -
4.2.10Clean Clean (post-cleanup) -
4.2.11Clean Clean (post-cleanup) -
4.2.18Clean Clean (post-cleanup) -
4.2.20Clean Clean (post-cleanup) -
4.2.21Clean Clean (post-cleanup) -
4.2.22Clean Clean (post-cleanup) -
4.2.23Clean Clean (post-cleanup) -
4.2.25Clean Clean (post-cleanup) -
4.2.26Clean Clean (post-cleanup) -
4.2.28Clean Clean (post-cleanup) -
4.2.29Clean Clean (post-cleanup) -
4.2.30Clean Clean (post-cleanup) -
4.2.31Clean Clean (post-cleanup) -
4.2.32Clean Clean (post-cleanup) -
4.2.33Clean Clean (post-cleanup) -
4.2.34Clean Clean (post-cleanup) -
4.2.35Clean Clean (post-cleanup) -
4.2.36Clean Clean (post-cleanup) -
4.2.37Clean Clean (post-cleanup) -
4.3.1Clean Clean (post-cleanup) -
4.3.2Clean Clean (post-cleanup) -
4.3.3Clean Clean (post-cleanup) -
4.3.4Clean Clean (post-cleanup) -
4.3.8Clean Clean (post-cleanup) -
4.3.11Clean Clean (post-cleanup) -
4.4.0Clean Clean (post-cleanup) -
4.4.3Clean Clean (post-cleanup) -
4.4.4Clean Clean (post-cleanup) -
4.4.5Clean Clean (post-cleanup) -
4.5.0Clean Clean (post-cleanup) -
4.5.2Clean Clean (post-cleanup) -
4.5.3Clean Clean (post-cleanup) -
4.5.5Clean Clean (post-cleanup) -
4.5.7Clean Clean (post-cleanup) -
4.5.8Clean Clean (post-cleanup) -
4.5.9Clean Clean (post-cleanup) -
4.5.10Clean Clean (post-cleanup) -
4.5.11Clean Clean (post-cleanup) -
4.5.14Clean Clean (post-cleanup) -
4.5.15Clean Clean (post-cleanup) -
4.5.17Clean Clean (post-cleanup) -
4.5.19Clean Clean (post-cleanup) -
4.5.21Clean Clean (post-cleanup) -
4.5.24Clean Clean (post-cleanup) -
4.5.25Clean Clean (post-cleanup) -
4.6.0Clean Clean (post-cleanup) -
4.6.1Clean Clean (post-cleanup) -
4.6.2Clean Clean (post-cleanup) -
4.6.4Current Current release
Clean — no supply-chain anomaly. Full git-level audit of ilab-media-tools (Media Cloud by interfacelab) covering all 162 published versions back to 2016-07. Single committer for 8 years, zero detection events, zero IOC matches, zero suspicious patterns in plugin-own code. The 58 code-scan findings on current trunk are all in vendored dependencies (Symfony, AWS SDK, Google Cloud, Firebase JWT, Carbon, ShortPixel) and are well-known legitimate uses. No further action required.
Plugin
| | | |---|---| | Slug | ilab-media-tools | | Name | Media Cloud for Bunny CDN, Amazon S3, Cloudflare R2, Google Cloud Storage, DigitalOcean and more | | Author | interfacelab (Interfacelab LLC), member since 2014-01-02 | | Active installs | 7,000 | | Total downloads | 543,955 | | Added | 2016-07-12 | | Last update | 2024-04-09 (v4.6.4) | | Closed? | No — never closed by wp.org | | Plugin URI | https://github.com/interfacelab/ilab-media-tools | | Author URI | http://interfacelab.io |
Methodology — git repo built from full SVN history
Standard event-driven triage didn't apply here (zero open events for this slug), so audit was performed proactively against the full release history rather than a single suspect-version delta.
# 1. Enumerate all 164 SVN tags
svn ls https://plugins.svn.wordpress.org/ilab-media-tools/tags/
# 2. For each tag in version order: svn export → rsync into git workspace → commit with svn author + date → tag
# (full script at /tmp/build-ilab-git.sh)
# 3. Result: /tmp/wpbeacon-git-repos/ilab-media-tools — 162 commits, 162 tags, 167 MB(One transient svn: E120108 connection error skipped tag 4.5.3; trunk = 4.6.4 was already represented so no double-count.)
Committer history
| committer_slug | first_rev | last_rev | commit_count | notes | |---|---|---|---|---| | interfacelab | r1453266 (2016-07-12) | r3067574 (2024-04-09) | 348 | sole human committer, member since 2014 | | plugin-master | r1453124 (2016-07-12) | r1453124 | 1 | wp.org SVN bootstrap commit, standard |
No transfers, no co-committer additions, no WPORG Plugins Team cleanup commits across 8 years.
Code-scan findings (current trunk, v4.6.4)
58 findings, 45 high-signal. Breakdown:
| Source | Count | Notes | |---|---|---| | lib/mcloud-symfony/ | ~25 | vendored Symfony components (cache, lock, var-dumper, http-foundation, http-kernel, dependency-injection, error-handler, debug, polyfill-mbstring, polyfill-intl-normalizer, var-exporter, routing, mime, messenger, http-client) — Mozart/PHP-Scoper namespaced | | lib/mcloud-aws/aws-sdk-php/ | ~7 | AWS SDK PHP — DecryptionTrait/V2, MetadataParserTrait, JsonParser, XmlParser, AbstractRestParser | | lib/mcloud-google/ | ~6 | Google Cloud SDK — cloud-storage SigningHelper + EncryptionTrait, protobuf Message, cloud-core test helpers | | lib/mcloud-firebase/php-jwt | 3 | Firebase JWT lib — base64_decode of PEM key/header/signature components | | lib/mcloud-nesbot/carbon | 2 | Carbon date library — Serialization trait + Mixin trait | | lib/mcloud-shortpixel/ | 1 | ShortPixel API client — base64_decode of original filename | | Plugin-own code | 2 | both benign — see below |
The two plugin-own findings — both benign
1. classes/Tools/Video/Driver/Mux/MuxAPI.php:204
$privateKey = base64_decode($signingKey['privateKey']);
return JWT::encode($options, $privateKey, 'RS256');Standard JWT signing pattern. The Mux video service requires RS256-signed JWTs to generate playback URLs; the private key is stored base64-encoded in plugin settings and decoded at sign time.
2. classes/Utilities/Search/Replacer.php:88
$unserialized = (!is_serialized($data)) ? false : @unserialize($data);Standard WordPress search-replace idiom — gated by is_serialized($data) (so unserialize is only called on input that is in fact serialized PHP), with @ to suppress notices on legacy malformed payloads. Used during media-cloud URL rewrites in serialized wp_postmeta rows.
Full-history attack-pattern sweep — all zero
Across all 162 commits, in plugin-own code (excluding lib/, external/Freemius/, vendor/):
| Pattern | Commits-with-match | |---|---| | eval(base64_decode(...)) | 0 | | eval(gzinflate(...)) | 0 | | create_function(...) | 0 | | preg_replace('/.../e', ...) | 0 | | @unserialize(file_get_contents(...)) | 0 | | @unserialize(wp_remote_retrieve_body(...)) | 0 | | extract($_GET/POST/REQUEST/COOKIE) | 0 | | include/require($_GET/POST/...) | 0 | | system/passthru/shell_exec($_...) | 0 | | str_rot13(base64_decode(...)) | 0 | | permission_callback => __return_true | 0 | | Catalog IOCs (fetch_ver_info, cdnstaticsync, analytics.essentialplugin, widgetlogic.org, puc_v[45]_Factory) | 0 |
Domain extraction (c2_http_call)
45 hostnames harvested by scan-deltas on 2026-04-30. All consistent with the documented feature set:
- Cloud storage: amazon.com, amazonaws.com, amazonwebservices.com, backblazeb2.com, digitalocean.com, googleapis.com, gstatic.com, kinsta.com, wasabisys.com, wpengine.com
- Image / video CDNs: imgix.com, imgix.net, imgur.com, imagify.io, kraken.io, shortpixel.com, tinify.com, mux.com
- Plugin's own brand: mediacloud.press
- Licensing: freemius.com
- Email: mandrillapp.com, sendgrid.com
- Misc legitimate: youtube.com, telegram.org, ifttt.com, ngrok.io, mcafeesecure.com, projecthoneypot.org, pwnedpasswords.com, amplitude.com, jsdelivr.net, ju.mp
- Doc/spec references in vendor libs: php.net, ietf.org, freedesktop.org, europa.eu, unoosa.org, symfony.com, spatie.be, wp-cli.org, firephp.org, wildfirehq.org, web.path, your.site
No callbacks to dynamic-DNS hosts, no Russian/Chinese VPS IPs, no domains younger than the plugin.
Directory-add timeline (organic)
| Version | Date | Added | Reason | |---|---|---|---| | 1.0.0 | 2016-07-12 | classes/, helpers/, public/, vendor/, views/, ilab-media-tools.php, readme.txt, LICENSE, README.md, tools.json | initial layout | | 1.5.1 | 2017-09-11 | config/ | settings system | | 3.0.7 | 2019-07-17 | external/Freemius, composer.json, composer.lock, docs/ | Freemius licensing integration | | 3.3.14 | 2020-02-19 | keys/public.key | RSA pubkey for license verification (never modified after) | | 4.1.0 | 2020-08-28 | lib/ (mcloud-* namespaced vendoring) | switched from vendor/ to scoped lib/ | | 4.2.34 | 2021-06-16 | resources/ | misc assets | | 4.4.4 | 2022-10-07 | .gitattributes, .gitmodules | repo housekeeping |
Every directory addition aligns with documented feature work in changelogs.
Verdict
Benign — clean. Long-running, single-author plugin with no supply-chain shape, no obfuscation, no hidden endpoints, no IOC matches. WP Beacon's existing event-driven detection correctly fired zero alerts on this plugin.
Cleanup status
cleanup_status = clean — nothing to remediate. Audit recorded for catalog completeness.