{"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/adversarial-observations-in-weather","title":"Adversarial Observations in Weather Forecasting","arxiv_id":"2504.15942","date":"2025-04-22","proceeding":null,"authors":["Erik Imgrund","Thorsten Eisenhofer","Konrad Rieck"],"abstract":"AI-based systems, such as Google's GenCast, have recently redefined the state of the art in weather forecasting, offering more accurate and timely predictions of both everyday weather and extreme events. While these systems are on the verge of replacing traditional meteorological methods, they also introduce new vulnerabilities into the forecasting process. In this paper, we investigate this threat and present a novel attack on autoregressive diffusion models, such as those used in GenCast, capable of manipulating weather forecasts and fabricating extreme events, including hurricanes, heat waves, and intense rainfall. The attack introduces subtle perturbations into weather observations that are statistically indistinguishable from natural noise and change less than 0.1% of the measurements - comparable to tampering with data from a single meteorological satellite. As modern forecasting integrates data from nearly a hundred satellites and many other sources operated by different countries, our findings highlight a critical security risk with the potential to cause large-scale disruptions and undermine public trust in weather prediction.","url_abs":"https://arxiv.org/abs/2504.15942v1","url_pdf":"https://arxiv.org/pdf/2504.15942v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"adversarial-observations-in-weather","repo_url":"https://github.com/mlsec-group/adversarial-observations","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"jax","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[{"task_slug":"weather-forecasting","task_name":"Weather Forecasting"}],"methods":[{"method_slug":"diffusion","method_name":"Diffusion"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2504.15942","atlas_url":"https://app.syntology.ai/?focus=2504.15942","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2504.15942"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+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":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/mlsec-group/adversarial-observations","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran":16,"unverified":3},"by_repo_kind":{"official":{"samples":19,"ran":16,"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":0,"samples":[{"code_sha256_prefix":"4cc47f7ac849edf6","entry":"filter_boundaries","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_heat.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_heat.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4cc47f7ac849edf6"}},{"code_sha256_prefix":"7a4d42fbf97494e7","entry":"filter_boundaries","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_rain.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_rain.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"7a4d42fbf97494e7"}},{"code_sha256_prefix":"85435776c18edbf9","entry":"generate_arrows","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_wind.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_wind.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"85435776c18edbf9"}},{"code_sha256_prefix":"87c077e386d5bc14","entry":"get_day_progress","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/graphcast/data_utils.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/graphcast/data_utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"87c077e386d5bc14"}},{"code_sha256_prefix":"b5873791a50ceac1","entry":"get_year_progress","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/graphcast/data_utils.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/graphcast/data_utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"b5873791a50ceac1"}},{"code_sha256_prefix":"4add98e004001140","entry":"load_ablation_data","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/generate_report.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/generate_report.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4add98e004001140"}},{"code_sha256_prefix":"7f9c7e3200f28510","entry":"load_original_data","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/generate_report.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/generate_report.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"7f9c7e3200f28510"}},{"code_sha256_prefix":"4f7ead71448dfa1e","entry":"mollweide_to_lat_lon","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/generate_weather_targets.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/generate_weather_targets.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4f7ead71448dfa1e"}},{"code_sha256_prefix":"9e8afd8a3be2fc40","entry":"select_precipitation","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/evaluate.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/evaluate.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"9e8afd8a3be2fc40"}},{"code_sha256_prefix":"5f19780cb60bcce0","entry":"select_temperature","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/evaluate.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/evaluate.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"5f19780cb60bcce0"}},{"code_sha256_prefix":"4019ba2255cc23f9","entry":"select_wind_speed","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/evaluate.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/evaluate.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4019ba2255cc23f9"}},{"code_sha256_prefix":"fc190c4b4787b426","entry":"smooth","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_heat.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_heat.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"fc190c4b4787b426"}},{"code_sha256_prefix":"5b311a8c66c662aa","entry":"smooth","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_wind.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_wind.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"5b311a8c66c662aa"}},{"code_sha256_prefix":"e1e3d440dce57495","entry":"to_svg_path","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_heat.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_heat.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"e1e3d440dce57495"}},{"code_sha256_prefix":"4e35d01ab316d5c4","entry":"to_svg_path","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/case_study_wind.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/case_study_wind.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"4e35d01ab316d5c4"}},{"code_sha256_prefix":"f023499579335842","entry":"tree_map_cast","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/graphcast/casting.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/graphcast/casting.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f023499579335842"}},{"code_sha256_prefix":"bbfbc7f27f0dbf04","entry":"infer_floating_dtype","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/graphcast/casting.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/graphcast/casting.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"bbfbc7f27f0dbf04"}},{"code_sha256_prefix":"3142cf9dc1ad062e","entry":"load","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/graphcast/checkpoint.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/graphcast/checkpoint.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"3142cf9dc1ad062e"}},{"code_sha256_prefix":"dbdbe2a954f1104a","entry":"match_ablation_and_original","repo":"mlsec-group/adversarial-observations","repo_kind":"official","path":"src/generate_report.py","file_url":"https://github.com/mlsec-group/adversarial-observations/blob/HEAD/src/generate_report.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"dbdbe2a954f1104a"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}