Netflix Blog- Netflix的应用安全

这篇文章 Scaling Appsec at Netflix 是出自 Netflix Technology Blog Netflix的 应用安全团队的主要服务对象是在云基础架构上发布应用的工程团队, Netflix安全主张:安全是每个产品团队的责任 Netflix安全团队工作主要分为三类: 应用安全运营功能:传统的AppSec活动: BUG赏金分类,测试, 威胁建模,漏洞管理,产品安全。 安全合作伙伴关系:推动整体安全改进降低风险。 应用安全自动化:构建全面的应用程序库并启动自助安全指导。 运营Appsec功能由于存在高度中断,非持续性,过去的几个月,团队进行了重组,分为自动化和合作伙伴小组两个团队。 APPsec自动化队目标是提供 一致,可操作, 自我服务,为开发提供指导。通过Spinnaker 的平台,为开发人员提供单一的视图提供相关操作, 确保应用安全。 安全工作从过去的使用一些传动的DevSecOps方法如:静态代码扫描,动态测试,反模式grep, 转变为使用自动化方式提供自助服务。 合作伙伴小组更关注于与具有高风险的工程和产品团队(例如支付工程)密切合作, 目标是确定安全风险领域, 专注于更大的战略举措从而降低风险。 团队的最终目标是退出运营职责,将工作重点放到自动化和合作伙伴两种工作模式上。

2019-07-13 · 1 min · 30 words

python 解压指定路径下zip文件

概述: 项目变更版本需要源码包, 检查关键代码是否缺失,其中有一个步骤需要进入指定目录解压所有.ZIP压缩包 问题: 1. 并行处理; 2. zipfile extract后中文名称乱码; 解决: 并行处理使用 ,参考之前的扫描端口的套路修改; zipfile 解压乱码,踏着前人的足迹,查看了下python zipfile 源码open 函数中 如果zinfo.flag_bits 不是utf-8 都默认设为cp437 def open(self, name, mode="r", pwd=None, *, force_zip64=False): ... if zinfo.flag_bits & 0x800: # UTF-8 filename fname_str = fname.decode("utf-8") else: fname_str = fname.decode("cp437") ... ZIP File Format Specification 中描述 APPENDIX D - Language Encoding (EFS) ------------------------------------ D.1 The ZIP format has historically supported only the original IBM PC character encoding set, commonly referred to as IBM Code Page 437. This limits storing file name characters to only those within the original MS-DOS range of values and does not properly support file names in other character encodings, or languages. To address this limitation, this specification will support the following change. 代码: import os import zipfile from queue import Queue import time import threading from pathlib import Path print_lock = threading.Lock() def unzip(file): file_name, ext = os.path.splitext(file) if ext == ".zip": try: f = zipfile.ZipFile(file, 'r') for fn in f.namelist(): extract_path = Path(f.extract(fn)) extract_path.replace(fn.encode('cp437').decode('gbk')) with print_lock: print(file, 'unzip ok') except: with print_lock: print(file, 'unzip error') pass def threader(): while True: worker = q.get() unzip(worker) q.task_done() def create_thread( threadnums ): for x in range(threadnums): t = threading.Thread(target=threader) t.daemon = True t.start() if __name__ == "__main__": q = Queue() startTime = time.time() path = os.getcwd()+'\\源码' os.chdir(path) file_list = os.listdir(path) print(file_list) create_thread(100) for unzipfile in file_list: q.put(unzipfile) q.join() print('Time taken:', time.time()-startTime) 参考: python zipfile extract 解压 中文文件名 ...

2019-07-12 · 2 min · 240 words

LeetCode – Min Stack

题目: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. getMin() – Retrieve the minimum element in the stack. Example: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2. 解题: 与普通栈不同,增加了一个返回栈最小值的功能, 这里使用了两个栈, 一个保存数据 , 一个保存压栈过程中出现过的最小值。 ...

2019-07-10 · 2 min · 224 words

汇编文件中的CFI指令

这篇文章CFI directives in assembly file (18 Jan 2017), 是出自google 工程师Adam Langley 问题提出: 函数调用栈 : : | caller's stack | +----------------+ <----$rsp value before CALL | return address | +----------------+ <----$rsp at function entry | caller's rbp | +----------------+ <----$rbp always points here | callee's stack | 函数调用中 调用call指令时将call指令的下一条指令 return address 入栈, 其中return address存放在RIP寄存器中也就是将 RIP入栈,之后进入子函数后会将父函数的栈基地址入栈,其中父函数的栈基地保存在RBP寄存器中。 函数栈调用框架: push rbp mov rbp, rsp …. (子函数处理部分) mov rsp, rbp pop bp (leave) ...

2019-07-09 · 2 min · 231 words

函数栈的调用

 本篇主要通过反汇编与GDB两种方式分析函数栈的使用过程。 反编译方法: gcc -S Stop after the stage of compilation proper; do not assemble. The output is in theform of an assembler code file for each non-assembler input file specified.By default, the assembler file name for a source file is made by replacing the suffix.c, .i, etc., with .s.Input files that don't require compilation are ignored. gcc -S -o [source].s [source].c objdump gcc stack.c -o stack.oobjdump -S ./stack.o > stack_objdump.s 编译环境: 环境: cenos7, X86_64 ...

2019-07-07 · 9 min · 1777 words

获取进程信息相关命令

任务ID: pid: 进程ID tid:线程ID tgid:主线程ID 显示线程需要增加 L参数 ps -eLo pid,tid,tgid,pgrp,args 任务状态: 进程状态描述: D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct (“zombie”) process, terminated but not reaped by its parent ...

2019-07-03 · 2 min · 350 words

LeetCode – Perfect Squares

题目: Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. Example 1: Input: n = 12 Output: 3 Explanation: 12 = 4 + 4 + 4. Example 2: Input: n = 13 Output: 2 Explanation: 13 = 4 + 9. 解题1: 数学方式的解法:基于四平方和理论(Lagrange’s four-square theorem), 每个正整数均可表示为4个整数的平方和。 1. 如果整数包含因子4, 可以去掉不影响结果; 2. 如果除8余7的话, 肯定是由四个完全平方数组成; 3. 之后按照两个数的平方和拆解整数, 其中!!逻辑取反判断是否正整数还是0, 正整数!!后为1, 0!!后为0; ...

2019-07-02 · 2 min · 349 words

linux 任务状态定义

结构定义: Linux task_struct 结构中 涉及进程状态的属性有三个,其中进程对应的状态分为两类, 一类是运行中状态, 另一类是进程退出状态。 struct task_struct { ... /* -1 unrunnable, 0 runnable, >0 stopped: */ volatile long state; int exit_state; unsigned int flags; ... } 状态说明: TASK_RUNNING 等待运行状态 TASK_INTERRUPTIBLE 可中断睡眠状态 TASK_UNINTERRUPTIBLE 不可中断睡眠状态 TASK_STOPPED 停止状态(收到 SIGSTOP、SIGTTIN、SIGTSTP 、 SIG.TTOU信号后状态) TASK_TRACED 被调试状态 TASK_KILLABLE 新可中断睡眠状态 TASK_PARKED kthread_park使用的特殊状态 TASK_NEW 创建任务临时状态 TASK_DEAD 任务退出状态 TASK_WAKING 被唤醒状态 TASK_IDLE 任务空闲状态 /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task_state(). * * We have two separate sets of flags: task->state * is about runnability, while task->exit_state are * about the task exiting. Confusing, but this way * modifying one set can't modify the other one by * mistake. */ /* Used in tsk->state: */ #define TASK_RUNNING 0x0000 #define TASK_INTERRUPTIBLE 0x0001 #define TASK_UNINTERRUPTIBLE 0x0002 #define __TASK_STOPPED 0x0004 #define __TASK_TRACED 0x0008 /* Used in tsk->exit_state: */ #define EXIT_DEAD 0x0010 #define EXIT_ZOMBIE 0x0020 #define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) /* Used in tsk->state again: */ #define TASK_PARKED 0x0040 #define TASK_DEAD 0x0080 #define TASK_WAKEKILL 0x0100 #define TASK_WAKING 0x0200 #define TASK_NOLOAD 0x0400 #define TASK_NEW 0x0800 #define TASK_STATE_MAX 0x1000 /* Convenience macros for the sake of set_current_state: */ #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) #define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) /* Convenience macros for the sake of wake_up(): */ #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) /* get_task_state(): */ #define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \ __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ TASK_PARKED) 相关代码: 下面通过内核代码,看下任务状态转换的一个大致过程。 ...

2019-06-29 · 4 min · 671 words

Netflix Blog-令人愉快的用户界面:复活节彩蛋

 这篇文章 Delightful User Interfaces: Easter Eggs 是出自 Netflix Technology Blog 作者分享了网剧《Marvel’s Jessica Jones》最后一季的预告片标题页上设置的动态图特效的(Easter Eggs)的实现方法。 背景中摇摆闪烁的电灯,点击后预告片中的照片由 Jessica Jones和她的朋友,转化为Gregory Sallinge。 而这个特效没有使用视频或者webGL , 是通过css实现的。相比视频10MB,仅需要10kb的css与722kb 图片, 背景图片由5mb压缩到108kb, 没有对效果产生影响。(这里的kb我理解是byte) 下面从三个方面介绍了CSS动态图的实现思路: 1. 开灯效果(Turning on the lights) 使用animation property 通过三张片(关闭,闪烁,开启)图片的切换实现灯泡打开的效果; 通过transform ( (rotateX, rotateX, and translate), 及30帧图片模拟灯泡摇摆。 2. 灯管特效(Lighting: Flare and Flair) border-radius 设置影响边界, and filter: blur(80px) 设置影响区域. mix-blend-mode: 与背景颜色混合, 效果看上去很棒。 3. 背景聚焦(Bringing the background to focus) 使用 clip-path 用一个圆形对图片进行遮挡. 使用 **transition,**展示背景图片。 遇到的问题(求助StackOverflow) 1. 图片不能再某些浏览器分辨率下可以显示,解决方案 , 将opacity过渡到父元素 不仅仅是预告片 UI工程师与设计师的合作将其实现的更为简洁而有创意。

2019-06-27 · 1 min · 72 words

文件签名及校验方法

概述: 在上网下载镜像或安装文件时经常会看到MD5,SHA-1,SHA-256 ,signature,一起显示,这些文件帮助我们验证下载的文件是否损坏或者被篡改以及文件的真实性, 散列值可以使用windows, macOS,Linux内置命令进行验证。 文件签名可以使用工具gpg进行校验。 校验 完整性校验 通过文件散列来判断文件下载或移动后,是否有损坏, 可以用MD5, SHA1,SHA256,SHA224, SHA384等。我平时工作中用到的是MD5,判断相关版本文件是否修改。 LINUX md5sum,sha1sum, sha256sum md5sum /path/to/file sha1sum /path/to/file sha256sum /path/to/file WINDOWS certutil, Get-FileHash(需要使用windows Powershell) certutil -hashfile yourfilenameaddress MD5 certutil -hashfile yourfilenameaddress SHA1 certutil -hashfile yourfilenameaddress SHA256 Get-FileHash C:\path\to\file.iso -Algorithm MD5 Get-FileHash C:\path\to\file.iso -Algorithm SHA1 Get-FileHash C:\path\to\file.iso -Algorithm SHA256 Get-FileHash C:\path\to\file.iso -Algorithm SHA384 Get-FileHash C:\path\to\file.iso -Algorithm SHA512 Get-FileHash C:\path\to\file.iso -Algorithm MACTripleDES Get-FileHash C:\path\to\file.iso -Algorithm RIPEMD160 MACOS md5 ,shasum md5 /path/to/file shasum /path/to/file shasum -a 1 /path/to/file shasum -a 256 /path/to/file 真实性校验 使用gpg工具 , 主要分为两步 ...

2019-06-27 · 3 min · 502 words