{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/arxiv-2602-12825","title":"Reliable Hierarchical Operating System Fingerprinting via Conformal Prediction","arxiv_id":"2602.12825","date":"2026-02-13","proceeding":null,"authors":["Rubén Pérez-Jove","Osvaldo Simeone","Alejandro Pazos","Jose Vázquez-Naya"],"abstract":"Operating System (OS) fingerprinting is critical for network security, but conventional methods do not provide formal uncertainty quantification mechanisms. Conformal Prediction (CP) could be directly wrapped around existing methods to obtain prediction sets with guaranteed coverage. However, a direct application of CP would treat OS identification as a flat classification problem, ignoring the natural taxonomic structure of OSs and providing brittle point predictions. This work addresses these limitations by introducing and evaluating two distinct structured CP strategies: level-wise CP (L-CP), which calibrates each hierarchy level independently, and projection-based CP (P-CP), which ensures structural consistency by projecting leaf-level sets upwards. Our results demonstrate that, while both methods satisfy validity guarantees, they expose a fundamental trade-off between level-wise efficiency and structural consistency. L-CP yields tighter prediction sets suitable for human forensic analysis but suffers from taxonomic inconsistencies. Conversely, P-CP guarantees hierarchically consistent, nested sets ideal for automated policy enforcement, albeit at the cost of reduced efficiency at coarser levels.","url_abs":"https://arxiv.org/abs/2602.12825","url_pdf":"https://arxiv.org/pdf/2602.12825","source":{"archive":null,"snapshot":"2025-07-28","note":"not in the Papers with Code archive (frozen at the snapshot)","row_kind":"graph","title_abstract_authors_date":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)"},"code_links":[],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2602.12825","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2602.12825"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"mentioned_in_github":null,"is_official":null,"provenance":"deterministic:regex_extraction","mentioned_in_paper":null,"url":"https://github.com/rubenpjove/CP-HOSfing","reach":null}],"summary":{"unverified":15},"by_repo_kind":{"found_in_text":{"samples":15,"ran":0,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":15,"samples":[{"code_sha256_prefix":"d7e8451d9b5e8301","entry":"build_hierarchy_mappings","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"d7e8451d9b5e8301"}},{"code_sha256_prefix":"77dfde19e781b0a4","entry":"copy_artifact_file","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"77dfde19e781b0a4"}},{"code_sha256_prefix":"1f4b56dfe3b8f4e4","entry":"create_experiment_logger","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/utils/io_utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/utils/io_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"1f4b56dfe3b8f4e4"}},{"code_sha256_prefix":"1b0299cd27ed44ec","entry":"derive_mode_mapping","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"1b0299cd27ed44ec"}},{"code_sha256_prefix":"b9178b9503ac713a","entry":"discover_methods_and_alphas","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/regenerate_plots.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/regenerate_plots.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"b9178b9503ac713a"}},{"code_sha256_prefix":"3f8fa2ffe64f2634","entry":"discover_num_runs","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/regenerate_plots.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/regenerate_plots.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"3f8fa2ffe64f2634"}},{"code_sha256_prefix":"2b845b775278470d","entry":"format_metric_name","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/plotting.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/plotting.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"2b845b775278470d"}},{"code_sha256_prefix":"9f2e38455406b561","entry":"load_config_and_params","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/utils/io_utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/utils/io_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"9f2e38455406b561"}},{"code_sha256_prefix":"1c480da903e4a426","entry":"load_dataframe","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/data_split/src/inspect_splits.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/data_split/src/inspect_splits.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"1c480da903e4a426"}},{"code_sha256_prefix":"dd062a1e36281c6d","entry":"load_indices_mapping","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/data_split/src/inspect_splits.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/data_split/src/inspect_splits.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"dd062a1e36281c6d"}},{"code_sha256_prefix":"d4256e0099a6c43e","entry":"load_params","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/data_split/src/inspect_splits.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/data_split/src/inspect_splits.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"d4256e0099a6c43e"}},{"code_sha256_prefix":"89961336a325db80","entry":"load_pre_split_dataset","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/data_split/src/utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/data_split/src/utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"89961336a325db80"}},{"code_sha256_prefix":"f33ed7d26bd009f5","entry":"perform_two_stage_stratified_split","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/cp_experiment.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/cp_experiment.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"f33ed7d26bd009f5"}},{"code_sha256_prefix":"a6c05fbfccc9d9b8","entry":"plot_ab_comparison","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/confpred/src/plotting.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/confpred/src/plotting.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"a6c05fbfccc9d9b8"}},{"code_sha256_prefix":"51d83e84e7c5e28f","entry":"setup_logging","repo":"rubenpjove/CP-HOSfing","repo_kind":"found_in_text","path":"exps/utils/io_utils.py","file_url":"https://github.com/rubenpjove/CP-HOSfing/blob/HEAD/exps/utils/io_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"GPL-3.0","inline_ok":false,"mcp_get_code":{"code_sha256":"51d83e84e7c5e28f"}}]},"arxiv_metadata":{"licence":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)","fields":["title","abstract","authors","date"],"primary_category":"cs.LG","source":"arxiv_2026.jsonl"},"syntology_extracted_results":{"kind":"leaderboard_placements","source":"Syntology's leaderboard-shaped extractor over the paper's own arXiv-HTML tables: a model pointed at a cell, the number was read from that cell and checked against the board's metric, dataset, split and scale, and an independent check accepted the entry; not reviewed by the paper's authors or the archive's editors","extractor_model":"global.anthropic.claude-sonnet-4-5-20250929-v1:0","verifier_model":null,"prompt_sha":"fa63d4bb9d755694","coverage":{"sentence":"Syntology has checked 6,264 of the 9,581 papers on this site that are newer than the archive; results from the others appear after they are checked.","papers_newer_than_archive":9581,"papers_checked":6264},"entries":[],"not_placed":{"boards":0,"rejected_by_independent_check":0,"refused_by_a_rule":0,"check_did_not_answer":0,"proposed_without_a_cell":0,"declined_by_site":0}}}