Skip to content

SIGSEGV when using with ionCube and Octane with RoadRunner #1995

Description

@pushpesh-cometchat

Describe your environment
Container built via a Dockerfile

FROM php:8.4-cli AS encoder

ENV DEBIAN_FRONTEND=noninteractive

RUN dpkg --add-architecture i386 \
    && apt-get update -y && apt-get install -y \
    curl \
    unzip \
    git \
    zip \
    libc6:i386 \
    libstdc++6:i386 \
    zlib1g:i386 \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www

RUN git config --global --add safe.directory /var/www

COPY . .

RUN composer install --no-dev --no-interaction --optimize-autoloader --ignore-platform-reqs

RUN curl -fsSL "https://s3.us-east-1.amazonaws.com/downloads3.ioncube.com/eval_download_packages/ioncube_encoder/linux_i686/en/ioncube_encoder_evaluation.tar.gz" \
    -o /tmp/encoder.tar.gz \
    && tar -xzf /tmp/encoder.tar.gz -C /opt \
    && rm /tmp/encoder.tar.gz

RUN mv /var/www/vendor /tmp/vendor

RUN /opt/ioncube_encoder_evaluation/ioncube_encoder.sh -C -x86-64 -84 \
    --allow-reflection-all \
    --copy "*.blade.php" \
    --copy "*.json" \
    --copy "*.yaml" \
    --copy "*.yml" \
    --copy "*.xml" \
    --copy "*.txt" \
    --copy "*.md" \
    --copy "*.lock" \
    --copy "*.js" \
    --copy "*.css" \
    --copy "*.html" \
    --copy "*.env*" \
    --copy "*.pem" \
    --ignore "ioncube_encoder*" \
    #--ignore "tests/" \
    #--ignore "Tests/" \
    /var/www/ -o /tmp/encoded; \
    EXIT_CODE=$?; \
    if [ $EXIT_CODE -ne 0 ] && [ $EXIT_CODE -ne 8 ]; then exit $EXIT_CODE; fi


FROM php:8.4-cli

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update -y && apt-get install -y \
    build-essential \
    curl \
    unzip \
    git \
    zip \
    librdkafka-dev \
    pkg-config \
    libargon2-dev \
    libcurl4-openssl-dev \
    libedit-dev \
    libsodium-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    zlib1g-dev \
    libffi-dev \
    libxslt1-dev \
    libzip-dev \
    libpng-dev \
    libfreetype6-dev \
    libjpeg-dev \
    libonig-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install \
        pdo_mysql \
        mysqli \
        bcmath \
        pcntl \
        sockets \
        gd \
        zip \
        exif \
        opcache \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN curl -fsSL https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -o /tmp/ioncube.tar.gz \
    && tar -xzf /tmp/ioncube.tar.gz -C /tmp \
    && cp /tmp/ioncube/ioncube_loader_lin_8.4.so "$(php -r 'echo ini_get("extension_dir");')" \
    && echo "zend_extension=ioncube_loader_lin_8.4.so" > /usr/local/etc/php/conf.d/00-ioncube.ini \
    && rm -rf /tmp/ioncube /tmp/ioncube.tar.gz

RUN pecl install rdkafka && docker-php-ext-enable rdkafka
RUN pecl install redis && docker-php-ext-enable redis
RUN apt-get update && apt-get install -y --no-install-recommends $PHPIZE_DEPS \
    && pecl install opentelemetry && docker-php-ext-enable opentelemetry \
    && rm -rf /var/lib/apt/lists/*
RUN php -m | grep -qix opentelemetry || { echo "!!! opentelemetry extension FAILED TO LOAD"; exit 1; }

RUN echo "memory_limit=4096M" > /usr/local/etc/php/conf.d/memory.ini \
    && echo "max_execution_time=600" >> /usr/local/etc/php/conf.d/memory.ini \
    && echo "opcache.enable=1" > /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.memory_consumption=256" >> /usr/local/etc/php/conf.d/opcache.ini \
    && echo "opcache.max_accelerated_files=20000" >> /usr/local/etc/php/conf.d/opcache.ini

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www

COPY --from=encoder /tmp/encoded /var/www

COPY --from=encoder /tmp/vendor /var/www/vendor

RUN php vendor/bin/rr get-binary --location /usr/local/bin 2>/dev/null || \
    (curl -sSL https://github.com/roadrunner-server/roadrunner/releases/download/v2024.3.5/roadrunner-2024.3.5-linux-amd64.tar.gz -o /tmp/rr.tar.gz && \
     tar xzf /tmp/rr.tar.gz -C /usr/local/bin --strip-components=1 && \
     rm /tmp/rr.tar.gz) || \
    echo "RoadRunner will be downloaded at runtime"

RUN chmod -R 777 storage bootstrap/cache 2>/dev/null || true
RUN chmod 644 /var/www/public.pem /var/www/private.pem 2>/dev/null || true
RUN chmod 644 /var/www/fat-public-key.pem /var/www/fat-private-key.pem 2>/dev/null || true

EXPOSE 8000

# Start Laravel Octane with RoadRunner
CMD ["php", "artisan", "octane:start", "--server=roadrunner", "--host=0.0.0.0", "--port=8000", "--workers=4", "--max-requests=1000"]

Steps to reproduce

  • Encode a test.php(content as simple as possible e.g. <?php echo 'test';) file via ionCube (https://www.ioncube.com/ choose PHP8+)
  • Place the encoded php content as test.php next to the Dockerfile
  • Build the Dockerfile with: docker build -f Dockerfile -t otel-debug-local .
  • Run the container with docker run --rm -it --entrypoint /bin/sh otel-debug-local

What is the expected behavior?
An output which says test

What is the actual behavior?
An error which says Segmentation fault / SIGSEGV

Additional context
Environment

  • PHP 8.4.22 (NTS, non-debug, api 20240924), x86_64, Debian (official php:8.4-cli)
  • ionCube Loader 15.5.0 (zend_extension, loaded first via 00-ioncube.ini)
  • opentelemetry extension 1.2.1 (also reproduced with 1.1.0) — any ext registering a Zend observer
  • Laravel 12, using Octane served via RoadRunner as seen in the Dockerfile above.

Using these OpenTelemetry packages:

"open-telemetry/detector-container": "^1.3",
"open-telemetry/exporter-otlp": "^1.0",
"open-telemetry/gen-otlp-protobuf": "^1.0",
"open-telemetry/opentelemetry-auto-curl": "^0.2.0",
"open-telemetry/opentelemetry-auto-ext-rdkafka": "^0.0",
"open-telemetry/opentelemetry-auto-guzzle": "^1.0",
"open-telemetry/opentelemetry-auto-http-async": "^1.2",
"open-telemetry/opentelemetry-auto-io": "^0.2.0",
"open-telemetry/opentelemetry-auto-laravel": "^1.0",
"open-telemetry/opentelemetry-auto-pdo": "^0.4",
"open-telemetry/opentelemetry-auto-psr18": "^1.2",
"open-telemetry/opentelemetry-logger-monolog": "^1.2",
"open-telemetry/sdk": "^1.0",

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions