An Azure service that is used to control and help secure email, documents, and sensitive data that are shared outside the company.
Update — root cause found; this is not a MIP SDK regression.
After deeper investigation, the hang was caused by a libcurl symbol collision in our own process, not by the MIP File SDK.
Another dependency in our binary — TensorFlow's libtensorflow_framework.so — statically bundles its own copy of libcurl and exports the curl symbols (curl_easy_init, curl_easy_perform, curl_global_init, the full curl_multi_* set, etc.) unversioned into the global dynamic-symbol namespace.
Because that library is loaded before the system libcurl.so.4, the MIP SDK's versioned references (curl_easy_init@CURL_OPENSSL_4, etc.) bound to TensorFlow's bundled curl instead of the system libcurl. Verified with LD_DEBUG=bindings:
binding file /lib/libmip_core.so to .../libtensorflow_framework.so.2: symbol `curl_easy_init' [CURL_OPENSSL_4]
binding file /lib/libmip_core.so to .../libtensorflow_framework.so.2: symbol `curl_easy_perform' [CURL_OPENSSL_4]
So the SDK's default HTTP delegate was unknowingly running on a foreign curl build — which is what produced the CLOSE_WAIT socket with no MIP thread polling it.
Confirmation that the SDK is not at fault: keeping MIP 1.18.124 with its default HttpDelegate and only forcing the curl symbols to resolve to the system libcurl (LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libcurl.so.4) fully resolves the hang — AddEngineAsync completes and decryption works, with TensorFlow still loaded. The earlier 1.16-vs-1.18 correlation was coincidental with another build change introducing the bundled-curl dependency.
One optional hardening suggestion:
it may be worth a documentation note that the SDK requires its libcurl symbols to resolve to a compatible system libcurl, and that other libraries which statically bundle libcurl with default-visibility symbols can interpose on it and wedge the HTTP layer — it's a subtle footgun that's hard to diagnose.