How We Audited a High-Traffic WooCommerce Enterprise Stack on OVH and Mitigated Remote Code Execution (RCE) via insecure file uploads
Initial Reconnaissance and Attack Surface Identification
Our engagement began with a deep dive into the existing infrastructure. The client operates a high-traffic WooCommerce store hosted on OVH’s dedicated server offerings. The stack comprises a typical LAMP (Linux, Apache, MySQL, PHP) setup, with additional components like Redis for caching and potentially Varnish for front-end acceleration. The primary concern was the potential for Remote Code Execution (RCE) due to insecure file upload functionalities, a common vulnerability vector in e-commerce platforms.
The initial reconnaissance phase focused on identifying all entry points for file uploads. This included:
- WooCommerce core features (product images, user avatars, etc.)
- Custom theme and plugin functionalities
- Third-party integrations (e.g., payment gateways, shipping modules)
- Admin panel upload interfaces
- API endpoints that accept file uploads
We leveraged automated tools like Burp Suite’s scanner and manual inspection of the application’s source code and network traffic to map these upload points. Understanding the context of each upload (e.g., allowed file types, size limits, sanitization routines) was critical.
Exploiting Insecure File Uploads: The RCE Vector
The most critical vulnerability discovered was within a custom-developed plugin responsible for handling product variations and associated media. This plugin allowed administrators to upload ZIP archives containing images and metadata. The sanitization process was fundamentally flawed, failing to properly validate file types and execute arbitrary code within the uploaded archives.
Specifically, the plugin’s PHP script, let’s call it variation_importer.php, performed the following inadequate checks:
- It checked the MIME type of the uploaded file, but relied on the client-provided MIME type, which is easily spoofed.
- It did not perform server-side validation of the actual file content or extension after extraction.
- It extracted the contents of the ZIP archive directly into a web-accessible directory without proper sanitization or renaming.
An attacker could craft a malicious ZIP archive containing a PHP file (e.g., shell.php) with a seemingly innocuous image extension (e.g., shell.php.jpg) or even a file with no extension that the server would interpret as PHP. When this archive was uploaded and extracted, the shell.php file would be placed in a directory accessible via the web server.
Consider a simplified (and vulnerable) snippet from the plugin’s code:
Vulnerable PHP Upload Handler (Conceptual)
<?php
// Assume $_FILES['zip_archive'] is populated and security checks are minimal
$uploadDir = '/var/www/html/wp-content/uploads/variations/'; // Web-accessible
$zip = new ZipArchive;
$res = $zip->open($_FILES['zip_archive']['tmp_name']);
if ($res === TRUE) {
// THIS IS THE CRITICAL FLAW: No validation of extracted file types/names
$zip->extractTo($uploadDir);
$zip->close();
// Further processing...
} else {
// Handle error
}
?>
By uploading a ZIP containing a file like:
<?php // shell.php echo "<pre>"; system($_GET['cmd']); echo "</pre>"; ?>
and extracting it to the webroot, an attacker could then execute arbitrary commands via a URL like:
http://your-store.com/wp-content/uploads/variations/shell.php?cmd=ls -la
Server-Side Configuration and Hardening
The OVH environment provided a robust foundation, but server-level configurations were crucial for mitigating RCE and other web vulnerabilities. We focused on several key areas:
Apache Configuration for File Upload Security
While application-level fixes are paramount, Apache can provide an additional layer of defense. We configured Apache to prevent direct execution of PHP files in specific upload directories. This is achieved by using .htaccess files or the main Apache configuration.
# In /var/www/html/wp-content/uploads/variations/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|phps|shtml|inc|module|php-cgi)$">
Order Allow,Deny
Deny from all
</FilesMatch>
# Prevent execution of files with no extension if they are interpreted as PHP
<Files "*.">
ForceType application/octet-stream
</Files>
This configuration explicitly denies access to files with common PHP extensions and forces any file without an extension to be downloaded as a binary stream, preventing direct execution.
PHP Configuration (`php.ini`)
Beyond application logic, PHP’s own configuration plays a vital role. We reviewed and adjusted php.ini settings to enhance security:
; Disable dangerous functions that could be abused for RCE disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,pcntl_exec,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_signal,pcntl_alarm,pcntl_fork,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror,pcntl_strerror