| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Fuzz target for cl_load() | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2025-02-14 10:24:30 -05:00
										 |  |  |  * Copyright (C) 2018-2025 Cisco Systems, Inc. and/or its affiliates. All rights reserved. | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  |  * Authors: Micah Snyder | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, | 
					
						
							|  |  |  |  * this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
					
						
							|  |  |  |  * this list of conditions and the following disclaimer in the documentation | 
					
						
							|  |  |  |  * and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 3. Neither the name of the copyright holder nor the names of its contributors | 
					
						
							|  |  |  |  * may be used to endorse or promote products derived from this software without | 
					
						
							|  |  |  |  * specific prior written permission. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
					
						
							|  |  |  |  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | 
					
						
							|  |  |  |  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
					
						
							|  |  |  |  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
					
						
							|  |  |  |  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
					
						
							|  |  |  |  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
					
						
							|  |  |  |  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
					
						
							|  |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
					
						
							|  |  |  |  * POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "clamav.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-30 12:41:45 -07:00
										 |  |  | /* Apple does not define __pid_t */ | 
					
						
							|  |  |  | #ifdef __APPLE__
 | 
					
						
							|  |  |  | typedef pid_t __pid_t; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  | void clamav_message_callback(enum cl_msg severity, const char* fullmsg, | 
					
						
							|  |  |  |                              const char* msg, void* context) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ClamAVState | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     ClamAVState() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Silence all the log messages, none of them are meaningful.
 | 
					
						
							|  |  |  |         cl_set_clcb_msg(clamav_message_callback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cl_init(CL_INIT_DEFAULT); | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~ClamAVState() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Global with static initializer to setup an engine so we don't need to do
 | 
					
						
							|  |  |  | // that on each execution.
 | 
					
						
							|  |  |  | ClamAVState kClamAVState; | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cl_error_t ret; | 
					
						
							|  |  |  |     char tmp_file_name[200]  = {0}; | 
					
						
							|  |  |  |     unsigned int sigs        = 0; | 
					
						
							|  |  |  |     FILE* fuzzdb             = NULL; | 
					
						
							|  |  |  |     struct cl_engine* engine = NULL; | 
					
						
							|  |  |  |     unsigned int dboptions; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __pid_t pid = getpid(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dboptions = | 
					
						
							|  |  |  |         CL_DB_PHISHING | CL_DB_PHISHING_URLS | | 
					
						
							|  |  |  |         CL_DB_BYTECODE | CL_DB_PUA | CL_DB_ENHANCED; | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined(CLAMAV_FUZZ_CDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.cdb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_CFG)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.cfg", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_CRB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.crb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_FP)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.fp", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_FTM)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.ftm", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_HDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.hdb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_HSB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.hsb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_IDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.idb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_IGN)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.ign", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_IGN2)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.ign2", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_LDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.ldb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_MDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.mdb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_MSB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.msb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_NDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.ndb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_PDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.pdb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_WDB)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.wdb", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #elif defined(CLAMAV_FUZZ_YARA)
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d.yara", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     snprintf(tmp_file_name, sizeof(tmp_file_name), "tmp.dbload.%d", pid); | 
					
						
							| 
									
										
										
										
											2020-11-20 21:45:18 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     fuzzdb = fopen(tmp_file_name, "w"); | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  |     fwrite(data, size, 1, fuzzdb); | 
					
						
							|  |  |  |     fclose(fuzzdb); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 19:22:14 -08:00
										 |  |  |     /* need new engine each time. can't add sigs to compiled engine */ | 
					
						
							|  |  |  |     engine = cl_engine_new(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* load the fuzzer-generated sig db */ | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     if (CL_SUCCESS != (ret = cl_load(tmp_file_name, | 
					
						
							|  |  |  |                                      engine, | 
					
						
							|  |  |  |                                      &sigs, | 
					
						
							|  |  |  |                                      dboptions))) { | 
					
						
							| 
									
										
										
										
											2021-12-15 19:22:14 -08:00
										 |  |  |         printf("cl_load: %s\n", cl_strerror(ret)); | 
					
						
							|  |  |  |         goto done; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* build engine */ | 
					
						
							|  |  |  |     if (CL_SUCCESS != (ret = cl_engine_compile(engine))) { | 
					
						
							|  |  |  |         printf("cl_engine_compile: %s\n", cl_strerror(ret)); | 
					
						
							|  |  |  |         goto done; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | done: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Clean up for the next round */ | 
					
						
							|  |  |  |     if (NULL != engine) { | 
					
						
							|  |  |  |         cl_engine_free(engine); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-26 20:14:29 -07:00
										 |  |  |     unlink(tmp_file_name); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-04 14:26:42 -08:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } |