eval() on string config values
from checkpoints. A malicious checkpoint with crafted adam_betas achieves
arbitrary code execution when training is resumed.fairseq/optim/adam.py:91 - eval(self.cfg.adam_betas)fairseq/optim/adamax.py:42 - eval(self.args.adamax_betas)fairseq/optim/cpu_adam.py:78 - eval(self.cfg.adam_betas)fairseq/optim/fused_lamb.py:44 - eval(self.args.lamb_betas)fairseq/optim/adafactor.py:55 - eval(self.args.adafactor_eps)malicious_checkpoint.pt - Checkpoint with eval-exploitable adam_betaspoc_fairseq_eval_rce.py - Standalone PoC script1import torch
2state = torch.load("malicious_checkpoint.pt", weights_only=False)
3adam_betas = state["cfg"]["optimization"]["adam_betas"]
4# adam_betas = "__import__('os').system('echo RCE')"
5eval(adam_betas) # This is what fairseq does at adam.py:91eval() with ast.literal_eval() in all 5 optimizer files.