Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Review and document multi-threading support and limitations #3215

Open
eduar-hte opened this issue Aug 7, 2024 · 4 comments
Open

Review and document multi-threading support and limitations #3215

eduar-hte opened this issue Aug 7, 2024 · 4 comments
Labels
3.x Related to ModSecurity version 3.x

Comments

@eduar-hte
Copy link
Contributor

eduar-hte commented Aug 7, 2024

The goal of this issue is to collect and centralize information about multi-threading support of the current version of modSecurity , as the topic has come up in a number of issues and there are documented guidelines about usage in this context.

Multi-threading support

The library is expected to work in multi-threaded scenarios, as stated in #1726. This means that any issues should be related to incorrect usage or bugs in the current implementation.

"The modSecurity life cycle is divided into different stages. The stage that the rules are loaded is not threading safe by design. (...) Once the rules are loaded multiple requests can share the same RulesSet object, leading to parallelism while addressing different requests in different processes or threads." (Source: #2536, here)

Notes

  • Operator & Action (including Transformation) objects are created in the first stage, when rules are loaded and parsed, so their initialization is not synchronized. If their evaluation updates internal state, this needs to be protected to prevent issues in multithreaded contexts.

Examples

The repository currently includes an example of usage of the library in a multi-threaded context, see reading_logs_via_rule_message in the examples directory.

Potential issues/limitations

  • Shared files (audit or debug log) potential deadlock or incorrect behaviour on non-Windows platforms
    • NOTE: This has not been reproduced or reported as an issue, but is documented here as discussed in the context of a similar issue in the Windows port.
    • A deadlock using shared files was found in the initial port of the library to Windows (Add support to build libModSecurity v3 on Windows #3132) which was addressed in Fixed shared files deadlock in a multi-threaded Windows application #3210.
    • The PR discussion mentions the possibility of a similar issue (or other incorrect behaviour) happening in non-Unix platforms due to the use of the F_SETLKW fcntl to lock the shared files.
    • The library previously used a mutex (using shared memory to make it available to other processes in a multi-process context), but this was replaced by the F_SETLKW fcntl in commit 3d20304 due to an unlocking issue under heavy load using nginx, where an acquired lock would not be released when the process was killed.
    • A possible way to address this would be to go back to the mutex (plus shared memory) implementation but using the robust mutex feature in pthreads, that when a process terminates while holding the mutex notifies the next acquirer of this situation with the EOWNERDEAD return value, which allows it to recover the mutex and make it 'consistent' (see PTHREAD_MUTEX_ROBUST).

Reviewed/addressed issues

Misc

  • The unit_test program has support to run the operator/transformation tests in a multi-threaded context (launching 50 threads and running each test 5000 times).
    • The goal is to check if the evaluation of the operator/transformation triggers an issue or unexpected result.
    • Notice that allocation & initialization of the operator/transformation is performed in the main thread (as this is done in the stage where rules are loaded, see above).
    • This feature was introduced in PR Add support to run unit tests in a multithreaded context #3221.
@eduar-hte
Copy link
Contributor Author

eduar-hte commented Aug 7, 2024

"The modSecurity life cycle is divided into different stages. The stage that the rules are loaded is not threading safe by design. (...) Once the rules are loaded multiple requests can share the same RulesSet object, leading to parallelism while addressing different requests in different processes or threads." (Source: #2536, here)

@airween: I think #3138 could be closed with a reference to this.

@eduar-hte
Copy link
Contributor Author

Created PR #3216 to try to correct this.

eduar-hte added a commit to eduar-hte/ModSecurity that referenced this issue Aug 9, 2024
- This is controlled by specifying the 'test_multithreaded' argument
  when running `unit_test`.
- The goal is to detect if the operator/transformation  fails in this
  context.
- In this mode, the test will be executed 5'000 times in 50 threads
  concurrently.
- Allocation & initialization of the operator/transformation is
  performed once in the main thread, while the evaluation is executed in
  the threads.
  - This is consistent with the library's support for multithreading,
    where initialization and loading of rules is expected to run once.
    See issue owasp-modsecurity#3215.
eduar-hte added a commit to eduar-hte/ModSecurity that referenced this issue Aug 9, 2024
- This is controlled by specifying the 'test_multithreaded' argument
  when running `unit_test`.
- The goal is to detect if the operator/transformation  fails in this
  context.
- In this mode, the test will be executed 5'000 times in 50 threads
  concurrently.
- Allocation & initialization of the operator/transformation is
  performed once in the main thread, while the evaluation is executed in
  the threads.
  - This is consistent with the library's support for multithreading,
    where initialization and loading of rules is expected to run once.
    See issue owasp-modsecurity#3215.
@eduar-hte
Copy link
Contributor Author

  • MODSEC_MUTEX_ON_PM define & --enable-mutex-on-pm configure flag

The need for this optional lock was reviewed and confirmed not to be necessary. PR #3227 was submitted to remove it.

@eduar-hte
Copy link
Contributor Author

  • string.h's ascTime uses std::ctime, which is not safe in multi-threaded contexts

Created PR #3228 to address this.

eduar-hte added a commit to eduar-hte/ModSecurity that referenced this issue Aug 13, 2024
- This is controlled by specifying the 'mtstress' argument when running
  `unit_test`.
- The goal is to detect if the operator/transformation  fails in this
  context.
- In this mode, the test will be executed 5'000 times in 50 threads
  concurrently.
- Allocation & initialization of the operator/transformation is
  performed once in the main thread, while the evaluation is executed in
  the threads.
  - This is consistent with the library's support for multithreading,
    where initialization and loading of rules is expected to run once.
    See issue owasp-modsecurity#3215.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.x Related to ModSecurity version 3.x
Projects
None yet
Development

No branches or pull requests

1 participant