用Python删除图像中潜在的恶意软件

问题描述 投票:0回答:2

我已经读过.PNG,.JPEG和其他图像文件类型可能包含恶意软件。

我正在寻找删除嵌入在用户上传的图像中的潜在恶意软件。 Python中是否有一种方法可以从本质上“拉平”将本质上删除任何恶意内容的图像?有点像如果要拍摄图像的屏幕截图然后保存屏幕截图?还是可能存在无法轻易损坏的图像类型?

我已经将所有用户上传的内容托管在一个单独的域上,但是想知道是否可以进一步执行此操作。

python python-imaging-library malware
2个回答
0
投票

“恶意”内容包含在图像元数据中。

[当您读取矩阵中的图像数据(像素,颜色)时(例如,使用枕头,也就是python中的PIL库),您只需获取图像数据。

当您将其保存回来时,元数据将丢失,仅保留图像数据。

但是保存起来可能会有不良的副作用:

  • 有损压缩会改变图像
  • 取决于输出格式,透明度可能不受支持并丢失

0
投票

最简单的说,位图图像包含两件事:

  • 元数据,它是有关图像的信息,以及

  • 像素数据,本身就是像素颜色。

元数据包含关键的内容,例如图像的高度和宽度,通道数,每个像素的位数,图像的色彩空间以及如何压缩。它也可能包含不太重要的补充信息,例如:

  • EXIF数据-使用了什么相机,什么镜头,什么曝光,GPS信息等等
  • ICC色彩配置文件,可实现准确的色彩再现
  • IPTC信息-新闻和电信信息,版权,主题标记等
  • 地理参考和/或摄影测量信息-请参见GeoTIFF
  • 注释-可能包含任意信息(和恶意软件)

像素数据包含组成图像的像素网格的颜色(可能还包含任何透明度)。它经常被压缩。

请注意,以上内容只是简单的说明。我只提到了位图文件,没有提及矢量文件,例如SVG文件,这些文件可能包含自己的一系列问题,例如“ Billion Laughs DoS Attack”参见https://en.wikipedia.org/wiki/Billion_laughs_attack

也请注意,完全有可能将整个可执行程序附加到图像的末尾或中间,而不必破坏图像读取器/显示程序,这些程序通常会忽略他们无法理解的信息,而是尝试使用它们。最好使用他们所做的部分。如果您想举个例子,在这里我要制作一个红色图像,并将128kB的数据附加到末尾,并在Mac的终端机中显示它,而不会出现macOS

的任何投诉。
magick -size 1024x768 xc:red image.png             # make red image
dd if=/dev/zero bs=128 count=1024 >> image.png     # append 128kB
open imge.png                                      # use "xdg-open" on Linux

也请注意,有可能使用隐写术嵌入其他信息,例如,劫持每个像素的最低有效位并使用它来传达消息或携带某些意外载荷,例如恶意软件或水印。由于它是最低有效位,因此通常在视觉上无法察觉。


所以,现在的问题是,您希望做出什么样的权衡,或者换种方式“您有多偏执?”您决定从图像中删除的信息越多,您无意中丢失一些信息的可能性就越大。您以后需要的信息。如果去除EXIF数据,您将不再知道何时拍摄图像,在哪里拍摄或由谁拍摄。如果去除ICC色彩配置文件,则某些观看者的图像可能会褪色,过饱和或绿色。如果删除IPTC信息,则可能由于合同要求保留该信息而构成了对许可的侵犯。如果删除地理参考信息,则数据可能变得无用。如果删除注释,则可能会丢失掩盖信息,版权或标记信息。如果将格式从PNG / TIFF / GIF更改为JPEG,将失去透明度和准确性。如果从TIFF更改为PNG,将无法存储32位,64位或浮点数据以及4个以上的通道。如果您从JPEG更改为PNG,则可能会无意中将文件放大数十倍或数百倍。

因此,您几乎可以采取的最偏执的操作是将位图加载到内存中,然后以一种无法存储任何其他像素数据的格式(例如,出于性能方面的考虑,将其保存在内存中,而不是磁盘中)。 PPM或原始RGB(A)字节),然后将其重新保存为JPEG或PNG。这将丢弃所有EXIF / IPTC / Geo数据和注释,以及在图像末尾或中间附加在无关数据上的任何注释。如果需要具体示例,可以在终端中使用以下ImageMagick命令:

magick input.jpg -strip ppm:- | magick ppm:- result.jpg

如果使用的是PIL / Pillow和Python,则可以:

from PIL import Image
import numpy as np

# Load image
im = Image.open('image.jpg')                                     

# Convert to format that cannot store IPTC/EXIF or comments, i.e. Numpy array
na = np.array(im)                                                                       

# Create new image from the Numpy array and save
result = Image.fromarray(na).save('clean.jpg')

如果需要保留一些元数据,则需要考虑其他选项。

© www.soinside.com 2019 - 2024. All rights reserved.