使用OpenSSL的程序被360报创建进程,是误报还是特性?
关于OpenSSL客户端程序触发360“创建进程”提示的问题
我为学习OpenSSL库(此前未使用过)从网上复制了一份示例代码,使用cygwin64编译为client.exe后运行,弹出360提示窗口显示:
Risky program behavior: Create a process
请问这是360的误报,还是Windows环境下的OpenSSL库会创建进程?
示例代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define PORT 8000 #define SERVER_IP "127.0.0.1" #define SERVER_KEY "./serverkey.pem" #define SERVER_CERT "./servercert.pem" #define CA_CERT "./cacert.pem" // 初始化OpenSSL库 void init_openssl() { SSL_load_error_strings(); OpenSSL_add_all_algorithms(); SSL_library_init(); } //创建原始套接字 int create_connect_fd() { struct sockaddr_in serv_addr; int client_fd; // 创建socket if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 使用inet_pton转换IP字符串为网络字节序 if(inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr)<=0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接服务器 if (connect(client_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } return client_fd; } //创建ssl上下文 SSL_CTX* create_ssl_ctx() { const SSL_METHOD *method; SSL_CTX *ctx; // method = TLSv1_2_client_method(); method = TLS_client_method(); ctx = SSL_CTX_new(method); if (!ctx) { printf("Unable to create SSL context"); ERR_print_errors_fp(stderr); return NULL; } // 加载服务器证书和私钥 if (SSL_CTX_use_certificate_file(ctx, SERVER_CERT, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); printf("load server cert failed\n"); return NULL; } if (SSL_CTX_use_PrivateKey_file(ctx, SERVER_KEY, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); printf("load server key failed\n"); return NULL; } // 检查私钥和证书是否匹配 if (!SSL_CTX_check_private_key(ctx)) { printf("cert and key mismatch\n"); return NULL; } //加载CA证书 if (!SSL_CTX_load_verify_locations(ctx, CA_CERT, NULL)) { printf("load ca cert failed\n"); return NULL; } //必须验证服务端证书,不设置则不验证 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); return ctx; } int main() { SSL_CTX *ctx; SSL *ssl; int client_fd,send_len; char buf[102400] = {0}; /* 初始化SSL库 */ init_openssl(); /* 创建SSL_CTX结构体 */ ctx = create_ssl_ctx(); if(ctx == NULL) { printf("create ssl ctx failed\n"); return -1; } /* TCP协议连接到服务器 */ client_fd = create_connect_fd(); if(client_fd < 0) { printf("create client fd failed\n"); return -1; } //创建ssl对象 ssl = SSL_new(ctx); SSL_set_fd(ssl, client_fd); //ssl握手 if (SSL_connect(ssl) == -1) { ERR_print_errors_fp(stderr); return -1; } printf("Connected with %s encryption\n", SSL_get_cipher(ssl)); /* 发送数据 */ char buf_send[1024]; while (1) { fgets(buf_send,sizeof(buf_send),stdin); send_len=SSL_write(ssl, buf_send, strlen(buf_send)); // send_len = SSL_write(ssl, buf, sizeof(buf)); if(send_len < 0) { printf("SSL_write failed\n"); } else { printf("write len:%d\n", send_len); } } SSL_shutdown(ssl); SSL_free(ssl); close(client_fd); SSL_CTX_free(ctx); return 0; }
问题解答
这大概率是360的误报。
首先看你提供的代码,里面完全没有主动创建进程的逻辑(比如Windows的CreateProcess、类Unix的fork这类系统调用),核心功能就是建立TCP连接、完成SSL握手,然后循环发送用户输入的内容,没有任何可疑行为。
至于Windows环境下的OpenSSL库,正常的TLS客户端流程不会主动创建额外进程。不过有个可能:你用Cygwin编译的程序,Cygwin本身在启动时可能会加载一些底层支持的辅助进程(比如依赖cygwin1.dll的相关操作),360可能把这种Cygwin程序的启动行为误判成“创建进程”的风险操作。
另外也可以排查下编译时是否链接了非预期的库,但从代码来看不存在这类问题,所以基本可以确定是安全软件的误报。
内容的提问来源于stack exchange,提问作者ho tian
相关产品推荐
相关产品推荐

