黑客故事:如何接管Java/Clojure/Scala程序员的电脑

Sonatype已经对此帖做出了相应的反应,并在他们的博客上声明将会对所有的用户开启SSL链接。这变化让Java程序的生态系统变得更加安全可靠,我为此感到非常高兴。

虽说如此,但如果当你看到这个博客,并考虑花10美元来评估你的产品是否需要这个安全性的需要时,答案是否定的。这就好比汽车公司决定花10美元来评估他们的汽车是否需要气囊。幸运的是,现实生活中汽车公司必须安装气囊。

Sonatype的这次机制修改令我感到很开心,希望他们能够继续减少安全性与产品的冲突。对于我们开发者而已,为用户提供最安全的最有保障的产品是我们的责任。用户对于不能处理好产品与安全性的容忍度能有多大。

有一天,我看到我的防火墙是这么设置的,于是我开始对我的一个Clojure项目进行入侵:

然后我通过80端口在 http//repo.maven.apache.org下载了clojure.jar。这意味着我将能够通过一个未加密的http来下载包。我一开始认为这是leiningen问题。但结果完全不是。Clojure.jar和其他许多的jar包在Java/Clojure/Scala领域都很重要,他们都会被正式的放在Sonatype提供的一个公共服务 – Maven CentralSonatype有一个机制:只有那些拥有身份标识的人才允许SSL链接。你需要通过捐给Apache基金会十美元,才能获得身份标识和SSL链接。如果你不相信我说的话,捐赠的网页在这,此机制在此博客上声明。这里面甚至提到了中间人攻击。

因为身份标识是针对个人或者组织分发,所以像maven或者leiningen这些工具不能绑定它。如果你使用这些工具,那么下载java程序或者安装它的一些依赖不会通过SSL。经过我在twitter和Sonatype的一个员工对此事进行了争论,确认了此事。

你下载的jar包会来自中间人的,并且你执行的代码会被恶意软件替换过。要想阻止这类的事情发生,你需要小心的执行每一步操作,稍有不慎就会支付别人十美元。

通常什么时候会发生这类事情?如果你曾链接过咖啡店的公共网络或者别人的无线网络,中间人就能和你通信了。你的网络服务提供者应能够随意的跟你通信,有的人这么做是为了打广告。或者,你也会还会遭受来自国家操纵的这类攻击。

Dilettante

为了证明这有多么容易,我写了一个中间人代理dilettante,它功能是拦截来自于maven central的JAR包然后再注入恶意代码进去。

通过dilettante来代理http的传输,然后给任何在maven central下载的JAR包设置后门。那个设置了后门的版本同时会保留原有的功能,但是当他们使用的这个类库的时候,将会提示一个友好的信息。你可以看这个视频
或者截图:

源代码在这

具体实现

JAR包从maven central 下载的时候,由于是通过HTTP进行传输的,因此中间人可以随意的替换。JAR包是可以被标识的,但是根据我对于标准工具使用的经验,这些标识是不会被检查的。其他唯一的方法可以验证一个也是通过HTTP传输的SHA1和。当dilettante发现有JAR来自maven central,它将会把一个拥有后门的版本来替换成原来的。然后替换后的版本将会在受害者的电脑上运行恶意的代码。由于SHA1仅是通过HTTP传输,那么dilettante会简单地将它所能看到的所有哈希表替换成对应的拥有后面JAR包的哈希表。

我用优秀的mitproxy类库来创建我的工具。我先为代理写一个inline script,然后又用libmproxy创建一个独立的工具。

package dilettante;

public class Dilettante {
    public static void() {
        // do some evil stuff
    }
}

JAR包只是一个包含资源,类和元数据的压缩包。我通过添加自己的类到JAR,从而给这个JAR设置了后门。

稍微头疼的是想办法如何调用我的恶意代码。我知道受害者肯定会下载一些类库。然而我需要不管用户调用类库中的哪个类,它都能运行我的代码,并且还不能影响以前类库的正常使用。

Java有静态类块这一概念,它能在类级别进行初始化。当类加载到内存的时候,静态类里面的代码会只被调用这一次。在我把恶意的类插入到Jar包之后,我就能像下面这样在静态块里面调用代码:

import dilettante.*;
static {
    Dilettante.backdoor();
}

为了插入上面的代码,我需要将它直接插入到Java class里面,而不是source文件。我是使用Karakatau将代码以Jasmin的格式插入进去。Karakatau是一个针对Python的Java 反编译/编译类库。

.method static <clinit> : ()V
  ; method code size: 4 bytes
  .limit stack 0
  .limit locals 0
  invokestatic dilettante/Dilettante backdoor ()V
  return
.end method

局限性

这只是个概念化的试验,同时它还是存在局限性。

1.目前由于一些原因,它还不是很快:

我必须进行反编译和编译。如果能够直接插入编译好的代码到类里面,那就更高效了。

我实际上是通过使用Python的zipfile类库将压缩包的类文件都创建了个副本。从空间和速度方面而言,这是不高效的。如果能够更加了解zip的功能,可能会找到一个高效插入数据的方法。

2.如果用户同时下载多个JAR包。那么我将会逐个设置后门。恶意的代码在每个JAR只会被执行一次。但是如果多个jar被设置了后门,那么它将会被执行多次。如果我们将那个猫的图片替换成一个高质量,稳定的后门并且它能够只影响系统一次,那么这个问题就不会再出现。

黑客故事:如何接管Java/Clojure/Scala程序员的电脑,首发于博客 – 伯乐在线

用三段 140 字符以内的代码生成一张 1024×1024 的图片

Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0 到 255 之间的整数,表示位于 (i, j) 的像素点的颜色值。举个例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么图像的最左上角那个像素就是蓝色。参赛者编写的代码会被插进下面这段程序当中(我做了一些细微的改动),最终会生成一个大小为 1024×1024 的图片。

// NOTE: compile with g++ filename.cpp -std=c++11

#include <iostream>
#include <cmath>
#include <cstdlib>
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // square
#define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root

unsigned char GR(int,int);
unsigned char BL(int,int);

unsigned char RD(int i,int j){
   // YOUR CODE HERE
}
unsigned char GR(int i,int j){
   // YOUR CODE HERE
}
unsigned char BL(int i,int j){
   // YOUR CODE HERE
}

void pixel_write(int,int);
FILE *fp;
int main(){
    fp = fopen("MathPic.ppm","wb");
    fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);
    for(int j=0;j<DIM;j++)
        for(int i=0;i<DIM;i++)
            pixel_write(i,j);
    fclose(fp);
    return 0;
}
void pixel_write(int i, int j){
    static unsigned char color[3];
    color[0] = RD(i,j)&255;
    color[1] = GR(i,j)&255;
    color[2] = BL(i,j)&255;
    fwrite(color, 1, 3, fp);
}

我选了一些自己比较喜欢的作品,放在下面和大家分享。

首先是一个来自 Martin Büttner 的作品:

201408121

 

它的代码如下:

unsigned char RD(int i,int j){
return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);
}

unsigned char GR(int i,int j){
return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);
}

unsigned char BL(int i,int j){
return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}

同样是来自 Martin Büttner 的作品:

201408124

 

这是目前暂时排名第一的作品。它的代码如下:

unsigned char RD(int i,int j){
#define r(n)(rand()%n)
static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):RD((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}

unsigned char GR(int i,int j){
static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):GR((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}

unsigned char BL(int i,int j){
static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):BL((i+r(2))%1024,(j+r(2))%1024):c[i][j];
}

下面这张图片仍然出自 Martin Büttner 之手:

201408125

 

难以想象, Mandelbrot 分形图形居然可以只用这么一点代码画出:

unsigned char RD(int i,int j){
float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47;
}

unsigned char GR(int i,int j){
float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47;
}

unsigned char BL(int i,int j){
float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return 128-log(k)*23;
}

Manuel Kasten 也制作了一个 Mandelbrot 集的图片,与刚才不同的是,该图描绘的是 Mandelbrot 集在某处局部放大后的结果:

201408126

 

它的代码如下:

unsigned char RD(int i,int j){
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880)
{b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 255*pow((n-80)/800,3.);
}

unsigned char GR(int i,int j){
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880)
{b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 255*pow((n-80)/800,.7);
}

unsigned char BL(int i,int j){
double a=0,b=0,c,d,n=0;
while((c=a*a)+(d=b*b)<4&&n++<880)
{b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
return 255*pow((n-80)/800,.5);
}

这是 Manuel Kasten 的另一作品:

201408122

 

生成这张图片的代码很有意思:函数依靠 static 变量来控制绘画的进程,完全没有用到 i 和 j 这两个参数!

unsigned char RD(int i,int j){
static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}

unsigned char GR(int i,int j){
static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}

unsigned char BL(int i,int j){
static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}

这是来自 githubphagocyte 的作品:

201408123

 

它的代码如下:

unsigned char RD(int i,int j){
float s=3./(j+99);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}

unsigned char GR(int i,int j){
float s=3./(j+99);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;
}

unsigned char BL(int i,int j){
float s=3./(j+99);
float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;
}

这是来自 githubphagocyte 的另一个作品:

201408127

 

这是一张使用 diffusion-limited aggregation 模型得到的图片,程序运行起来要耗费不少时间。代码很有意思:巧妙地利用宏定义,打破了函数与函数之间的界限,三段代码的字数限制便能合在一起使用了。

unsigned char RD(int i,int j){
#define D DIM
#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#define R rand()%D
#define B m[x][y]
return(i+j)?256-(BL(i,j))/2:0;
}

unsigned char GR(int i,int j){
#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1
return RD(i,j);
}

unsigned char BL(int i,int j){
A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];
}

最后这张图来自 Eric Tressler :

201408128

 

这是由 logistic 映射得到的 Feigenbaum 分岔图。和刚才一样,对应的代码也巧妙地利用了宏定义来节省字符:

unsigned char RD(int i,int j){
#define A float a=0,b,k,r,x
#define B int e,o
#define C(x) x>255?255:x
#define R return
#define D DIM
R BL(i,j)*(D-i)/D;
}

unsigned char GR(int i,int j){
#define E DM1
#define F static float
#define G for(
#define H r=a*1.6/D+2.4;x=1.0001*b/D
R BL(i,j)*(D-j/2)/D;
}

unsigned char BL(int i,int j){
F c[D][D];if(i+j<1){A;B;G;a<D;a+=0.1){G b=0;b<D;b++){H;G k=0;k<D;k++){x=r*x*(1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D;
}

 

用三段 140 字符以内的代码生成一张 1024×1024 的图片,首发于极客范 – GeekFan.net

黑客入侵后,重新夺回我的网站

自2012年3月开始我就一直运营的一个网站:RamshackleGlam.com 在上周被别人给盗了。它被一个叫“bahbouh”的家伙放到了一个名叫Flippa.com的拍卖网站上,差点就被卖给了出价最高的竞争者(大概3万刀的样子)。他答应给竞标人提供我的流量、文件以及数据,并且建议我可以受雇佣的形式继续写文章(或者说,他希望提供给竞标人“高质量的文章”和“SEO(搜索引擎优化)建议”来维持网站的流量售后服务)。

我是在上周六意识到我的网站被盗的。三天过后我把它给找了回来,而这中间经历了6个部门,超过50多名雇员的参与,和律师们的午夜会议,FBI的介入,以及一个诱捕行动——可能在Sandra Bullock主演的影片中出现过,只不过这次主角换成了…我。

当然,我之前就听说过身份盗用以及网络黑客的故事,但说实话,当这些事情发生在我身上时我的第一反应就是“这不可能!”即便是在发生后,我也没有完全弄懂为什么这是一件非常严重的事情。你(指黑客)难道就不能给我解释一下到底发生了什么事情,证明你是谁,怎么安排了这一切吗?!我们生活在这样一个高度被记录的世界,我完全想象不到有人能够伪装成别人带走任何真实的东西最后却全身而退,仅仅留下几个电话和我的一些懊恼。

这非常非常糟糕——它让我更惊恐、沮丧、难以适应——超乎了我的想象。

我从父亲那里找到了黑客的痕迹。他的朋友Anthony(也是他在Pro Italia Online上的合伙人,经营着一家名叫ThoughtBox的网站开发和咨询公司)曾经在Flippa上面浏览过——现在来看真是非常的巧——并发现了我的网站被放在了上面,并且列着一大堆可疑的清单。突然,我记起了在那天之前收到的一封邮件——它被我我当作垃圾邮件忽视掉了——来自于某人,说他“有兴趣购买”我的“博客”。我记得一个来自于YouTube的通知,有人在别处访问了我的账户——而我忽略了,上面说我登陆了一个移动设备,当时我以为是我的丈夫偶然登陆了我的账户。

但即便在我看到清单之后,我也没有在意:这看上去就像什么东西用几封邮件就能定下来一样。只是那个拍卖网站被定位在澳大利亚,并且没有联系电话,而当我发送了一封附带身份证复印件和网站的所有权证明后得到的却是一封打印信件。我询问了HostMonster——我花钱让他们运营我的网站,悲剧的发现我已经不再是我的网站的拥有者了:有人用他们的邮箱验证系统授权了我的域名转移给一个在GoDaddy(另外一个web注册服务,我也是他们的客户)上的私人账户。

为什么事情很严重?

如果你有一个依赖于URL的业务,你就会明白为什么这是一个非常让人沮丧的新闻:通过控制我的网站的域名,一个黑客就可以将这个网站完全拿下,或者将其重定向至任何地方。进一步讲,后来被证实这个黑客也同样控制了网站上的所有内容;他可以将我写的东西改道发送至任何他想要到的地方。

Ramshackle Glam可能“仅仅”是一个关于育儿、时尚和装饰的生活类博客,但这也是我花了五年的时间苦心经营的一个网站,而它却落到了某些不坏好意的人手中,这伤透了我的心。我本可以转移到一个新的URL,并导出我所都的内容到那上面(我确实做了备份),但这会让我损失大量的流量。这个网站可是我的主要收入来源,它关系到我的房子,我的两个孩子另一个马上就要出生了),我这周即将要出版的一本书,和我在工商学院的老公,这可不是开玩笑。失去这个URL很可能会对我的事业和生活造成实实在在的打击。

所以我做了什么?

这个事件之后的接下来几天很复杂,所以我会解释我所走的每一步到最后导致的结果(我会详细的描述细节,希望能为那些有类似经历的人提供帮助)。

1、我试图直接通过GoDaddy和HostMonster来解决问题,但这不管用。

从周日到周二,我花了大量的时间(而且很多都是在晚上)与GoDaddy和HostMonster进行电话沟通,而几乎所有的人都给了我同样的回答:“对不起,我们对此无能为力。”

HostMonster坚持认为由于他们不再控制这个域名,他们就没有什么能做的了。GoDaddy则认为由于该账户是私人的,并且那个人通过HostMonster的转移获取了域名的所有权,所以他们也不能做什么。

要说最后有什么进展:我引用了ICANN的关于域名的争端解决方案。这让我的案子升级了,但这也并没有导致什么实际行动。

原因在此:HostMonster的法律部门向我告知,他们启动转让纠纷需要以GoDaddy向我返还域名为前提,他们的“内部调查”才能找出证据证明在释放网站的过程中出现了哪些问题。换句话说,他们到时候就不得不承认他们把事情给搞砸了…而这将打开对他们的诉讼。

不用说,我不会再听什么法律部门的胡扯了。尽管乍一看大家好像都是清白的,但事实是我拥有的网站在没经我授权的情况下被转移了,要是我不启动一个耗时且费钱的诉讼我将什么也做不了,总之,这些都不能很快挽回我那个即将要被出售的网站。

所以这条道走不通了。

Screen Shot 2014-03-31 at 10.15.47 PM

译者注:如果你的域名在未经你授权的情况下被转移了,让支持人员告诉注册热线,说你有一个TEAC的适用场景并且需要立刻联系主管人。

2、我联系了FBI。这是我在正确的方向上走的关键的一步

在我发现转让的那个早上我就联系了FBI。我当时觉得自己蠢爆了,居然打了这样的电话,但事实却是这是一个国际网络犯罪事件,而FBI正好是干这个的。何况这也是我的事业。可能放到大背景下我这种事情简直就是鸡毛蒜皮的小事,可对我来说却不是,它可支撑着我的家庭。

那么让我来告诉你吧:所有在过去这一周遇到的令人吃惊的事情,绝大多数都是来自FBI。那天他们没过多久就给了我回应,包括几次电话和邮件的沟通,还在当天就派了两名特工来我家和我进行了一次当面的交流,一直到昨天,他们又来了一次。除此之外,过去这周我接触的每一个特工都非常能干,而且很友善,很体贴,也很投入并且行动非常迅速。他们待我并不是一个简单的号码,而是一个活生生的人。总而言之,他们令人尊敬。

而我所期望的是在一个邮箱上留言并在某个时刻收到一封信件;当然我并不想要立马就看到一封调查报告。当然,在这里我也不打算写这些调查过程,因为它还没有结束(尽管我得到了他们的授权),但是我觉得非常有必要讲一下我是如何对FBI的回应感到惊喜的。

3、我试图直接联系那个“卖家”要回我的网站。这起作用了,但也相当有戏剧性

当前面的工作都在进行的时候,我也在想办法直接找那个要卖我网站的家伙要回它。

我可不想直接联系那个“卖家”,要是让那个家伙知道网站的真实主人已经意识到了这笔交易,他很有可能会向我敲诈更多的钱。所以我找了Anthony——是他看到的最原始的清单,而且他还在Flippa上面有个有效账户——让他联系“bahbouh”问他是否有兴趣私下交易。经过一番讨价还价,我们最终得到了同意,并最终决定在一个第三方的交易网站(Escrow.com)上面完成交易:当确认卖家将域名转移给我之后钱才会打给他。

正当我以为一切都很顺利的时候,在周二的晚上,那个卖家突然要求我立即把钱打给他(在收到网站之前)。我拒绝了,结果他声称他要将网站卖给另外一个人:“sorry,bye”

以下是我当时的想法:如果我不给钱,那肯定是收不回我的网站了。如果给钱,那么有一种可能是他拿了钱立马跑掉,但也有可能他会履行他的承诺,把网站还给我。这就像一场赌博…但显然我毫无选择。所以我最后还是同意了。

我花了20几分钟的时间坐在这该死的GoDaddy账户面前,等着看我的钱是不是打了水漂。

然后我的网站回来了。

我立即将这个域名(和我的其它域名一起)转移到另一个账户上,并锁定了它们。并致电汇款公司让他们终止交易。

结果

RamshackleGlam.com又重新回到了我的怀抱,感谢那些不辞辛劳尽其所能帮助我的人。我的其它账户(包括银行账户及其它)都安全了。我最终也没有把钱给要回来,但那个小偷也没有得到它,永远都别想了。

这件事情总算结束了。该死的!

那么为什么我依然感到愤怒?

当然我会因为网站被偷而生气,但我对此无能为力。我之所以写这篇文章有一部分原因是我要让人们知道这种事情是确实会发生在我们每一个人身边的,也希望通过我的一些建议去帮助大家尽量避免悲剧的发生,但除此之外,真正激发我动笔的是我对GoDaddy和HostMonster的愤愤愤愤愤愤怒。我希望你们能明白。

这两家公司都没有质疑我的声明(有书面证据的支持)即我对网站的所有权,也没有怀疑网站在未经我授权的情况下被转移。而我仍然话花了几天的时间自己去找那个黑客——这几天足以让他做任何想做的事情——就是因为那群技术支持和监察员除了说“天啊,真糟糕。我们帮不了你”之外什么也做不了!

Screen Shot 2014-03-27 at 11.38.53 AM

Screen Shot 2014-03-27 at 11.40.01 AM

而当我找到真正能帮我的人——我是指那些能为我打一个电话或者按一个钮然后把我的财产还给我的人(亦或是简单的冻结它而避免被卖掉或摧毁),他们才不会跟我说这些。这帮人(指两家公司的人员)只会躲在他们的法律部门后面而不会做任何事,即使知道他们的不作为会逼我不得不跟一个罪犯做交易,或让我失去我事业的重要部分。

而黑客们也知道这些公司会这样做。

它们指着这活呢。

这是一个很严重的问题——一个犯罪组织不仅“无视”公司的政策,而且事实上导致了公司将自身的利益至于其所声称的对用户的“保护”之上。我能理解像HostMonster和GoDaddy这样的公司为什么会把精力都放在保护自己免受诉讼上吗?当然!但事实是他们并没有去“保护”他们的用户,而且刚好相反地加深了对他们所支持的那些小型企业和家庭的威胁。

这些公司知道如果他们堵住了那扇帮助的大门那些资产收到侵犯的用户将没有其他的依靠,他们不得不向罪犯妥协或是眼睁睁看着自己的事业——也很可能是生活——毁掉。这些公司也知道他们的不作为给那些依赖于用这种手段赚钱的黑客创造了良好的环境。而他们什么也不做。

这种情况必须得改变了。

我的意见,在我看来是值得去做的:

在代理公司的支持人员必须要非常熟悉ICANN有关域名分配的相关条例,同时也需要在第一时间从客户那了解情况后就制定一个行动计划,别让客户一个又一个电话的催。

此外,建立一个TEAC**可以让争议账户立即被冻结,直到事情得到圆满解决。这也不会需要任何一方去承认罪责;基于这样一个尝试:当存在争议时,我们需要确保域名必须是被安全的转移。

怎样做可以降低悲剧发生在你身上的概率:

1、要有一个非常非常靠谱的密码,并且经常更换。密码不要含有“明显”的单词(当然也不要有像“whitecat”或“angrybird”这样两个或多个连在一起的单词),而且应该包含大写字母、数字和符号。最好的密码看上去应该是杂乱无章的。

2、如果可以的话,最好使用一个单独的计算机(可以是个旧的或买个便宜点的)来处理跟财产有关的业务,比方说银行转账等等,否则的话指不准哪天你家小孩点了一个恶意链接就可能会招来黑客。

3、当你不再使用电脑和个人设备的时候就关掉它。

4、装一个杀毒软件(但是记住这也只能让你扫描到30-40%的病毒,所以哪怕是一次“彻底”的检查也不代表你的电脑是安全的)。

5、购买CyberRisk保险(可以点击链接查看更多信息,它可以确保你的利益不会因为网络攻击和数据泄露遭到大的损失)。

但要是悲剧真的发生了,那你该怎么做:

1、立即仔细的检查(并且截图)。不要删除任何的邮件以及其它信息,它们很有可能在后面起到重要作用。

2、立刻更改你所有的密码(包括——但不限于——域名注册商、网站托管、网站登录信息、邮箱、银行账户、无线家用电子产品、以及Apple ID)根据以下的规则。在情况还没有确定下来时我每隔几个小时都会改一次密码,并且在这之后我仍然会每隔几天都会改一次密码。

3、联系注册商,引用下面的ICANN方案,然后看是否能快速解决。要是你发现你自己走近死胡同也不要惊讶。

4、查看你的邮件的“过滤器”和“规则”(通常情况下,任何可能的设备都会被黑客推送邮件,比方说cetera)。

5、联系合适的执法部门(我联系了FBI是因为这看上去像是一个国际犯罪,至少也是个洲际犯罪——因为Escrow.com在加利福利亚而我在纽约)。

注意:每一种情况都会不同,而且我也不会全力推荐这些方法——虽然它们让我最终夺回了我的域名的控制权,但是让我不得已跟罪犯打交道。很明显这并不理想,而且也可能导致不可预料的结果。(尽管我老公说他也很想让大家知道我是个大坏蛋,但很明显这也不是事实…好吧,至少是在这件事上)

(完)

伯乐在线译者注:

*Icann.Org全名为互联网域名和号码管理组织,负责管理并协调DNSICANN的域名争议解决方案基本规定了在域名纠纷的案件下,原注册商(“Losing Registrar”,在转移发生前的域名持有人,与之相对的“Winning Registrar”,指在转移发生后的域名持有人)需要立即启动紧急转移行动接触方式(“TEAC”)将球踢到立刻解决的方向上来。当初一得到这个信息,我的案子就立刻升级了。

**TEAC:由ICANN建立的一种接触方式,用于其它注册商和ICANN在必要时快速解决两个注册商之间的域名转移问题。该接触必须在调查开始四小时之内响应,尽管最终的解决时间会很长。

黑客入侵后,重新夺回我的网站,首发于博客 – 伯乐在线

8个具有奇特功能的iPhone手机壳

市面上的iPhone手机壳太多了,即使你每天换一个一年都不会重样,一般的手机壳都只是起到保护手机的作用,而有些会让你感觉很饿(详见《十款“美味的”iPhone5s/5c外壳、支架》),但是还有一类手机壳还具有保护之外的功能,这些设计师在这个小小的手机壳充分地发挥着自己的创造力,让我们看一下这八个有独特功能的iPhone手机壳吧。

Tasklab TaskOne iPhone5/5s手机壳

这个iPhone的瑞士军刀外壳内置22个不锈钢的工具,并有大的铝合金按键按控制它们,这样你就可以用你的iPhone来修理任何东西了。

20140810_164507_395

 

Leverage i5 iPhone手机壳

这个由Graft公司设计的iPhone手机壳是世界上少有的模块化手机壳之一,它的后壳是可以更换的,可以换成耳机线缠绕器、信用卡或者是时髦的背板。

20140810_164522_239

 

Pocketbuddy iPhone5/5s手机壳

这个外壳也可以当做一个“储藏室”、药片盒和卡片夹,该手机壳是由轻的聚碳酸酯制造,虽然这个后壳会让iPhone变得笨重和叮当作响,但是它还是比较实用的。

20140810_164529_662

 

Sanwa PRJ016 iPhone4微型投影仪外壳

这个外壳带有1850mAh的电池,可以将你的手机充电到80%,同时它也是一个微型投影仪,可以投影电影、图片到你的墙上。

20140810_164535_486

 

iPhone镜子外壳

女士们,有了这个外壳你就不用翻箱倒柜地找镜子了,这个可以当做镜子用的外壳价格不菲,高达86美元,难道是用了可以让人变漂亮的镜子?

20140810_164547_920

 

SuperNova iPhone5打火机外壳

这个是吸烟者的梦想外壳,这个外壳可以当做打火机用,并且可以通过USB充电。

20140810_164600_158

 

Yobrush iPhone5梳子外壳

该外壳在意大利设计,美国制造,这个可以用来理顺头发的iPhone外壳售价14.99美元,并有五种颜色可选。什么时候给男士也设计一个剃须刀外壳啊。

20140810_164608_73

 

Mophie Space Pack iPhone5/5s手机壳

苹果配件的粉丝们应该同Tim Cook一样熟悉Mophie这个品牌,他们生产的这个Space Pack外壳不仅可以给iPhone5带来额外的1700mAh电量,同时还能扩充其内存空间,有16GB\32GB\64GB可选,虽然其笨重了一些,但是功能性还是不错的。

20140810_164620_828

8个具有奇特功能的iPhone手机壳,首发于极客范 – GeekFan.net

一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说最大的问题是标准不统一云云,但在我看来,最大的问题在于两个方面,一个是价格,一个是操作的简便性,技术上的问题并不是阻碍智能家居推广的核心因素。

再来说说最近很火很惹人爱的微软小娜,Cortana。本人作为微软的死忠,作为一名靠.Net混饭的屌丝程序男,自然是有一部撸妹的,并且在小娜推送当天更新了手机,迫不及待地体验了小娜的功能,小娜会记事、会提醒、会唱歌、会说笑话、会学林志玲等等着实让我惊叹了一把,而且语气非常接近自然人的语气,不是那种生涩的机器语调。作为平时生活中不使用Android,Iphone的我,那晚想当然的觉得小娜应该就是当今世界上最好的语音助手了吧,怀着这样的心情,让小娜给我定了个闹钟,第二天早早起床迫不及待要向同事得瑟一把了。

第二天给同事小马看后,小马淡然一笑,拿出他的Android手机,默默的打开手机上的一个叫“灵犀”的软件,递给我说:“试试这个”。不试不知道,一试,心情还有点小低落,优越感顿无,怎么说呢,应该说除了在语气上小娜占上风外,在识准率,识别速度,各类功能应用上,小娜和“灵犀”已然不是一个档次,可能是小娜刚起步吧,希望以后可以不断完善。

看了一下“灵犀”官网,恍然大悟,这就是科大讯飞的产品啊,再次把玩灵犀,就只想真心点赞了,当时脑子里还飘过一个画面,未来能够对百度造成威胁的,很有可能就是科大讯飞,科大讯飞将把持移动互联网的使用入口!哦,那画面太美,不知李彦宏怎么想这个问题。

语音识别不仅仅会影响到人们使用手机的方式,在智能家居方面也大有可为,最直接的就是带来操作上的便捷性,试想,如果你在家时,你慢悠悠的拿出你的手机,慢悠悠的打开你的操作应用,慢悠悠的点击一个控制按钮,然后你的电视或者调动窗帘才执行你的命令,这图的个什么啊,还不如直接走过去手动暴力解决,而如果你在家的时候,只需要说“小文,换到体育频道”,或者“小文,打开窗帘”,然后安放在屋子里的中控盒子二十四小时随时听候理解你的命令,出门在外的时候,也只需对着手机说一声就行,这才叫易用的智能家居啊!

今天我们就采用Arduino开发板+Asp.Net MVC Api+Android版的讯飞语言SDK,实现用语音来控制一个小Led的实验。

关于Arduino

我的硬件准备

091911085374196

 

左边是Arduino主板,右边是网络拓展板,下边的是什么?哈哈,实验室小孟同学亲手给我焊接的小小Led灯,用来模仿开关性质的设备,这么小,看着都是泪水啊。组合后就是这么个样子了

091919281318224

 

以上总造价不超过100元。

Ardunio是一个开源的开发板,据说国外都是小朋友和艺术家都可以玩的开发板,简单易学,功能完善,目前也是非常火爆。事实也确实如此,看了几个示例工程后,有一定开发基础的人一看就知道怎么玩了。大部分web开发者基本上可以直接上手Arduino的网络部分的开发,看一遍示例保证你明白怎么个搞法,不信?那上个截图吧,这是Ardunio提供的IDE,内置了很多常用的开发场景示例,基本上在示例的基础上简单修改就可以完成一些简单的任务。

090158394433266

 

如果你是一个web开发者,好吧,看到菜单你也应该联想到你熟悉的网站开发模式了吧,是的,Arduino为你提供了客户端模式,服务端模式,还有些不常用的其他模式,让我们来看看Ardunio的WebClientRepeatping,这是一个客户端轮询服务端的方式,简单粗暴,通信稳定,容易理解和上手,下面是Ardunio提供的该模式示例代码

/*
  Repeating Web client

 This sketch connects to a a web server and makes a request
 using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
 the Adafruit Ethernet shield, either one will work, as long as it's got
 a Wiznet Ethernet module on board.

 This example uses DNS, by assigning the Ethernet client with a MAC address,
 IP address, and DNS address.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13

 created 19 Apr 2012
 by Tom Igoe
 modified 21 Jan 2014
 by Federico Vanzati

 http://arduino.cc/en/Tutorial/WebClientRepeating
 This code is in the public domain.

 */

#include <SPI.h>
#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192, 168, 1, 177);

// fill in your Domain Name Server address here:
IPAddress myDns(1, 1, 1, 1);

// initialize the library instance:
EthernetClient client;

char server[] = "www.arduino.cc";
//IPAddress server(64,131,82,241);

unsigned long lastConnectionTime = 0;             // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds
// the "L" is needed to use long type numbers

void setup() {
  // start serial port:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection using a fixed IP address and DNS server:
  Ethernet.begin(mac, ip, myDns);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // if ten seconds have passed since your last connection,
  // then connect again and send data:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }

}

// this method makes a HTTP connection to the server:
void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the WiFi shield
  client.stop();

  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.println("GET /latest.txt HTTP/1.1");
    client.println("Host: www.arduino.cc");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
  }
}

请从头到尾看一变,我保证如果你有编程基础看一遍也就知道的差不多该怎么玩了。无非就是定时轮询,请求服务器,对返回的字符串进行处理。下面的代码就是我在上面代码的基础上做的修改,实现了定时从服务器获取命令,如果是1则打开Led,如果是2则关闭Led。

/*
  Repeating Web client

 This sketch connects to a a web server and makes a request
 using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
 the Adafruit Ethernet shield, either one will work, as long as it's got
 a Wiznet Ethernet module on board.

 This example uses DNS, by assigning the Ethernet client with a MAC address,
 IP address, and DNS address.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13

 created 19 Apr 2012
 by Tom Igoe
 modified 21 Jan 2014
 by Federico Vanzati

 http://arduino.cc/en/Tutorial/WebClientRepeating
 This code is in the public domain.

 */

#include <SPI.h>
#include <Ethernet.h>
const int ledPin =  2; 
// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF
};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192, 168, 1, 177);

EthernetClient client;

IPAddress server(你的服务器地址);

unsigned long lastConnectionTime = 0;             // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 2L * 1000L; // delay between updates, in milliseconds
// the "L" is needed to use long type numbers

void setup() {
  // start serial port:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  // give the ethernet module time to boot up:
  delay(1000);
  pinMode(ledPin, OUTPUT);
  // start the Ethernet connection using a fixed IP address and DNS server:
  Ethernet.begin(mac);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

}
int iscoming=0;

void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    if(iscoming==1){
      handle(c);
      iscoming=0;
    }
    if(c=='@'){
     iscoming=1;
    }
    Serial.write(c);
  }

  // if ten seconds have passed since your last connection,
  // then connect again and send data:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }

}

void handle(char value){
 if(value=='1'){
    Serial.print("dakai");
  digitalWrite(ledPin, LOW);
 }
 if(value=='2'){
    Serial.print("guanbi");
  digitalWrite(ledPin, HIGH);
 }
}
// this method makes a HTTP connection to the server:
void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the WiFi shield
  client.stop();
  // if there's a successful connection:
  delay(1000);
  if (client.connect(server, 8009)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    //api/getcmd是请求的网站资源
    client.println("GET /api/getcmd HTTP/1.1");
    client.println("Host: www.arduino.cc");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");

  }
}

Android客户端

关于科大讯飞的介绍,自己去官网看吧,深耕语音领域二十年,不是一般企业可以超越的,很好很强大。申请成为开发者,创建应用,开通服务,下载SDK(我下的是带UI的SDK),参考SDK的代码就可以开始自己的开发了。话不多说,直接上核心代码

/**
     * 听写UI监听器
     */
    private RecognizerDialogListener recognizerDialogListener=new RecognizerDialogListener(){
        public void onResult(RecognizerResult results, boolean isLast) {
            String text = JsonParser.parseIatResult(results.getResultString());
            mResultText.append(text);
            mResultText.setSelection(mResultText.length());
            sendmeg(text);
        }

    private void sendmeg(String msg){
         AsyncHttpClient client = new AsyncHttpClient();
         try {
                String url = "http://服务器地址/api/values/"+msg;
                client.get(url, new AsyncHttpResponseHandler() {
                    @Override
                    public void onSuccess(int statusCode, Header[] headers,
                            byte[] responseBody) {
                        super.onSuccess(statusCode, headers, responseBody);
                        Toast.makeText(CmdActivity.this,
                                "请求成功" + new String(responseBody), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(int statusCode, Header[] headers,
                            byte[] responseBody, Throwable error) {
                        // TODO Auto-generated method stub
                        super.onFailure(statusCode, headers, responseBody, error);
                    }
                });
            } catch (Exception e) {
            }

    }    /**

Asp.Net Mvc Api

服务端的代码相对就简单了,我这里创建了两个控制器,一个负责接收手机端的命令,存入数据库,一个负责返回Arduino的网络请求,将命令代码返回。虽然觉得没必要,还是上一下代码吧

接收手机端传过来的命令

// GET api/values/5
        public string Get(string id)
        {
            ardunioEntities a = new ardunioEntities();
            string tempid = "123456789";
            cmd c = a.cmd.Where<cmd>(n => n.ardunioid ==tempid).SingleOrDefault();
            if (c == null)
            {
                c = new cmd();
                c.ardunioid = tempid;
                c.command = "0";
                c.status = "未读";
                a.cmd.Add(c);
            }
            if (id.Contains("打开")) 
            {
                {
                    c.command = "1";
                    c.status = "未读";

                }
            }
            if (id.Contains("关闭"))
            {
                {
                    c.command = "2";
                    c.status = "未读";
                }
            }
            a.SaveChanges();
            return "接收成功!";

        }

返回命令给Arduino的请求

public string Get()
        {

            ardunioEntities a = new ardunioEntities();
            string tempid = "123456789";
            cmd c = a.cmd.Where<cmd>(n => n.ardunioid == tempid & n.status == "未读").SingleOrDefault();
            if (c == null)
            {
                return "@0";
            }
            c.status = "已读";
            a.Entry(c).State = EntityState.Modified;
            a.SaveChanges();
            return "@"+c.command;
        }

 

效果实现与总结

对着手机说“打开灯泡”,然后灯就亮了!话说程序员看到这一幕,兴奋之情溢于言表啊。(请忽略旁边的美桃,女友由于对我崇拜的五体投地给我洗的,嘻嘻)。

这篇文章只是一个小实验而已,后续还可以做很多有趣的玩法,比如在这个程序的基础上开发语音控制电动窗帘的的工作(目前正在玩耍…),比如直接弄一个Android开发板或者使用语音模块做一个中控,二十四小时伺服,回到家直接说话“小文,换台到体育频道”等等等等,现有的智能家居产品都可以把语音技术集成过来,相信会大大增加智能家居的易用性。

本月科大讯飞即将召开智能家庭产品发布会,我们实验室也申请了票,期待看到高大上的东东开开眼。。。。一场革命或许已经来临。

看完了就默默点个赞吧:)

092014084902993

一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino,首发于极客范 – GeekFan.net

以史为鉴:宁夏银行7月系统瘫痪最新解析

0

这段时间,存储圈内对宁夏银行7月系统瘫痪事件讨论热烈,为什么作为在IT基础架构和系统建设都相对严谨和严格的银行会频频出现宕机等问题。可能大家还记得2013年6月工行和中国银行的两次事件。

“6月23日,中国工商银行系统瘫痪导致全国多地工行系统柜面取款、ATM、网银等无法办理。24日,中国银行系统也短暂瘫痪,一时间金融业钱荒,银行股价暴跌,金融市场流动性紧张。”

对于去年发生的银行系统问题,网友讨论也比较多,归结起来,还是系统维护方面纰漏。

对于今年宁夏银行的系统瘫痪事件,官方消息如下:

银行二部(2014)187号正式发全国文件,对宁夏银行事故的描述大致如下2014年7月1日,宁夏银行核心系统数据库出现故障,导致该行(含异地分支机构)存取款、转账支付、借记卡、网上银行、ATM和POS业务全部中断。

经初步分析,在季末结算业务量较大的情况下,因备份系统异常导致备份存储磁盘读写处理严重延时,备份与主存储数据不一致,在采取中断数据备份录像操作后,造成生产数据库损坏并宕机。因宁夏银行应急恢复处置机制严重缺失,导致系统恢复工作进展缓慢,直至7月3日5点40分核心系统才恢复服务,业务系统中断长达37小时40分钟,其间完全依靠手工办理业务。

该事件的根本原因是在于该行安全生产意思薄弱、应急管理体系缺失、应急处置过程混乱。该行核心系统数据库版本严重老化,且2007年至今未购买核心数据库的维保服务,核心系统长期缺乏维护,事故发生后,无法获得系统供应商及时技术支持。系统恢复过程中,缺乏应急预案和准备,长时间无法实施有效处置,导致业务恢复缓慢,对银行运营产生较为严重影响。

对于这个事件的发生,网上论坛有网友开始怀疑当时在2010年进行的高大上的宁夏银行800公里灾备演练,当时号称区域性商业银行的第一次。

查阅资料,回忆当时演练现场,时任宁夏银行信息技术部总经理的王春表示,随着区域性商业银行的跨省发展,实施灾难备份系统已经势在必行,宁夏银现在实施成功之后,实现了宁夏银行所提出的“提升业务连续性,提升业务管理水平”的战略目标,做到了核心系统的灾难恢复的“全范围覆盖”。

其中演练主要包括了两种“突发情况”:数据库系统瘫痪和数据中心发生火灾——前者模拟宁夏银行生产中心数据库系统发生崩溃瘫痪的严重故障,测试根据需要启动应急响应流程,进行本地的数据库系统恢复;后者模拟生产中心发生大火,测试根据应急流程进行从银川到西安的异地切换。

整场演练全部在真实的生产环境进行,步骤衔接流畅,而且恢复速度让在场观摩人员无不惊叹,两个场景的演练时间加起来不过10分钟:第一场数据库瘫痪演练,4分钟成功恢复完成;第二场火灾演练,6分钟系统异地切换成功。

当时的IT环境是IBM AIX UNIX、Informix、EMC DMX800。

以上是宁夏银行2010年灾备演练情况的存储在线当时报道摘要,在整个演练过程中,飞康CDP起到了举足轻重的作用。为此,网友在论坛上评论说,“停止备份系统,竟然会导致主数据库损坏,看来FalconStor CDP ,不靠谱啊。”也有网友评论道:“系统维护没有跟上,再好的方案也会有问题。”

对此,阿明认为:宁夏银行本次事件发生的根本应该更多归咎在系统维护上,很多时候,大型企业或银行做过周密的预案或灾备演练之后,就放松了对系统的整体维护,这是发生问题的主要原因所在。为此,宁夏银行官方表态也是“2007年至今未购买核心数据库的维保服务,核心系统长期缺乏维护,事故发生后,无法获得系统供应商及时技术支持。”(要知道,数据库厂商很牛叉,这是圈内人士有目共睹的,既然长期不交“保护费”,自然得让你痛一下,痛定思痛之后,你就得乖乖上交数据库“保护费”了。)

说完今年宁夏银行这次事件之后,我们再回看一下去年工行、中行出现的系统问题,当时CSDN的夏梦竹同学找到了一位叫jaccc的IT顾问,这位顾问的看法分析很透彻,也很中肯,对当前宁夏银行出现的系统问题也有借鉴意义,大家不妨“温故知新”:

为什么IT系统会出问题?

1)现代IT系统非常复杂,当系统大到一定的程度,总会有失控的状况。世界上就从来都没有过没错误的复杂程序,问题只在于这个错误你有没有碰上而已。银行的系统是由很多不同软硬件厂商的产品拼在一起运作,复杂程度远超过普通家用电脑,这么简单的家用电脑还会死机呢….而且系统复杂到一定程度,就不是人多或者钱多就能完全解决问题的了,推荐看看《人月神话》。

2)要尽量不出问题,要钱,很多钱(比如中型银行建设一个过得去的容灾系统要上亿)。但出问题只是“有可能”,花的钱可是实实在在的。换了你是领导,你也不会无限制的向里面投钱。

3)稳定运行的最好的办法之一是不对系统进行改造。由于有新的业务要求,系统确实要不停的升级,很多银行每周都在升级,每次变动对系统的稳定运行都是一个挑战。你每天走路有时候还会摔倒,只要一动作,就有出错的可能,这就是科学。

为什么会大面积的出现问题?

因为三个字:大集中。最早之前,银行系统还没联网,一出问题只是某个区或者某个市。最近十多年银行业都在搞大集中:五大行除了中国银行之外的四家都已经完成了大集中。

为什么这种故障好像越来越多了?

以前没有微博没有微信,只要你不是倒霉的用户就不会知道出过问题。我要不是上微博也不知道工行出这么大的事。以前没有网银没有淘宝,你半夜不会买东西刷卡。用行话来说就是以前没那么多7*24的需求(一周7天,一天24小时运行)。

为什么没有应急预案或者应急预案没有起作用?

与电信运营商,政府行业,普通企业相比,银行是中国IT业中IT基础最好,最严谨的行业。比如有的银行还要求厂商维护人员不能操作,只能银行员工操作。

大的变更一定会有预案,甚至换个硬盘,改个IP这种做过几百次的操作都会有预案。但预案与真实一般都有相当差距。上面已经提到系统非常复杂,可能出现的问题如果真全部写下来,可能有几百几千分支。而且,系统的故障并不会根据你的应急预案来发生。

只靠应急预案真解决问题的概率比拿着《泡妞指南》泡到美眉的几率还低,应急预案的最重要的作用是应付上级监管,根据应急预案搭好可能需要的应急软硬件环境,大致理清概要思路,以及锻炼团队。真有复杂问题,还是靠牛人现场解决的多。

平心而论,工行的IT能力和运维水平在四大行里面不是第一就是第二了(不同的省份略有不同)。

为什么要停几个小时这么久?

先说定位问题的时间:从发现问题上报到IT信息中心(或者在监控系统发现问题),IT中心的人开始查系统,定位故障原因,如果定位不清还要找相关的软硬件人员到场或者远程网络支持(基于安全原因,银行大部分都不能远程网络查看系统,维护人员到数据中心也需要时间,如果还堵车…..),找出问题的根源,一小时算超快的了。类似你莫名高烧,到底是哪个器官出问题,去医院做检查做判断总需要时间吧???解决问题就更不好说了,其实和大家的电脑一样,往往重启是最有效的方法,但很多业务系统部分出现问题是不能重启的(可能会影响别的业务系统)。至今国外各大厂商的标准维护合同,绝大部分都没有承诺修复时间。??根据手头的一份略过时的银监会突发事件应急管理规范:一个省停业6个小时以上才算I级特别重大突发事件,3小时是II级,半小时以上是III级。以管窥豹,落叶知秋,几小时真不算什么。

不是说有容灾和备份吗?为啥不快速切过去就好了?

这是一个很常见的误解:出了故障的时候,有备份系统和容灾系统就可以很快恢复业务。一怀愁绪,几年离索,错,错,错。

先说备份系统,常规备份系统是不能运行业务程序的:备份一般只是把数据保存多一份或者几份,一般是在丢数据的时候才用来恢复,而且恢复的时间很多都在几小时以上。类似大家手头只有一个avi文件,没有播放软件也没法看啊,只不过银行的“播放软件”要架设起来就复杂了…..

再说容灾系统,强调一个连很多IT人都不清楚的事实:银行容灾系统不会轻易启用整体切换!前面已经说了,IT系统已经这么复杂了,容灾系统相当于再复制一套,复杂性增加了不止2倍。切换起来是非常麻烦,非常伤筋动骨,惊动非常多人力物力,不是碰到大灾大难(比如地震,机房着火,恐怖分子爆炸之类)不会进行切换。

当然平时会进行容灾切换演练,但一般不会拿核心系统来真实切换,原因是有风险。以前也出现过华东某省级行(还是某省某运营商?记不太清楚了)切换到了容灾中心后切不回生产中心的悲催惨剧。最近西北某地农信社成功的把核心生产切到了容灾系统上,比较不简单,不过这毕竟是独立法人的小银行,大行不是这么个玩法。

这么说吧,迄今为止,五千年来,四大行的核心容灾系统都没出现过需要两地切换的重大灾难的场景,和准备买iPhone6的肾一样,有两个,没切过,但时刻准备着切….其实个人不太靠谱的猜想,就算停个三五天,各大行都不会愿意全业务切换,今天这种停几小时的算个毛有啥好切的,赶快修好系统就是了。

另外,看到有不少评论说“没人敢担风险切换到灾备节点上”。其实一般是这样的:建好容灾系统之后往往都会写一套DRP(灾难恢复计划)或者BCP(业务连续性计划),就是容灾系统启动的流程方案,里面会规定好什么场景下由什么人拍板切换到灾备中心,一般不会真出问题才临时来拍脑袋来想,(当然临时调整也是有可能的),也不是谁说切换就谁去背黑锅。

当然,大部分的小故障会通过双机切换,快速重启部分应用的等方式解决。但很快解决了,你们就意识不了其实已经出过故障了嘛,是不是有点人择原理的味道?……但总有无法快速解决的问题。补充一句,当然业界有很多新技术已经把备份高可用灾备等揉在一起了,但银行业应用还不多,这里就不展开了。

升级要失败,快速回退不就好了嘛?

一个常见的误会:升级不成功马上回退啊。这是很理想的情形,现实的情形是这样的:

1)技术上无法回退。我举个例子,你从winxp升级到win7,升到一半,蓝屏了,或者报某个文件包找不到了。你会回退吗?

2)回退的风险更大,升级过程中很多配置,软硬件都改掉了,改不回来了,或者耗费的时间比继续升级更大。

3)硬着头皮冲过去就算超了时间的还能找个理由掩饰一下,回退了就确定升级失败了,下次继续升级的政治压力会很大。

所以实际情况中,除非可以很干净利落的回退,而且实在升级无法成功,才会回退。真的升级切割出问题会进行回退的不超过5%。

周日到底出什么问题了?

在中国,无论出现什么IT系统问题,对外宣称总是电脑系统升级。我以前就有个变态的习惯在处理故障中途如果有空(等别人处理或者等系统回滚什么的时候)就打呼叫中心电话,听那些美眉怎么解释系统用不了了。清一色的,100%的,毫无例外都说是电脑系统升级。当我再问为什么大白天升级啊?为什么之前不通知我们客户啊?这时候就能体现呼叫中心的培训能力的差距了。

回到今天这事,别说我现在还没去八卦,就算知道了也不可能公开说,这是职业操守的问题。而且有的故障的真相是查不出来的(你知道你每次生病的确切原因吗?),有的故障是查出来但不能实说(一般故障分析报告书很快就能到竞争对手手中)。这种情况下,怎么去写故障分析报告,是一门艺术:真相不重要,达到目的才重要。这个目的有可能是大事化小,有可能是小事化大,水深着呢。

这几天微信圈里,继续在讨论宁夏银行系统问题,据圈内人士透露,银监会正在查这件事情, IBM和飞康都在等待结果。相信事实的真相不久后将浮出水面。

银行系统相对复杂,银行IT建设也相对要求严格与苛刻,在建设好了IT系统之后,只是万里长征走了第一步,后面更为重要的是长期的运行与维护,包括核心系统、数据库的后续维保等,因此,这也是为什么某国内著名厂商舍得将设备免费送给银行测试一年多,希望得到银行采购后长期使用,只有使用之后才有价值,一旦使用了,后续的服务收费才是真金白银。

因此,不管是什么情况,不管遇到什么变化,只有长期的服务品质不变,长期保持演练时的心态不变,即便遇到突发情况,也会比想象的情况要好一些。

以史为鉴:宁夏银行7月系统瘫痪最新解析,首发于博客 – 伯乐在线

树莓派摄影大赛精选照片亮相欣赏

全球著名开源硬件公司 Adafruit 在今年6月份举办了树莓派摄影挑战赛,在历经了两个多月的角逐今天该挑战赛的冠军终于诞生,冠军能够获得价值$314的 Adafruit 商城代金券,而其他14名获奖选手获得$30代金券……

53de20ebaf601

 

本次大会公开向社交媒体用户开放,用户只需要使用树莓派的摄像头拍摄照片然后打上#RPPA标签上传到社交网络就能参与本次活动,本次活动收集了大量的图片,经过 Adafrui t最终评定下面这张全景图成为了为本次冠军。

53de20e73f82d

 

本次图像挑战赛的冠军,利用乐高和树莓派打造的Panobot拍摄

53de20e9060f3 53de20e73f82d 53de20e7ee00c 53de20e82fb7e 53de20e84e93a 53de20e86b81b 53de20e8aa253 53de20e923532 53de20e954de8

树莓派摄影大赛精选照片亮相欣赏,首发于极客范 – GeekFan.net

[转载]PHP 5.3.17 编译安装时出现 undefined reference to `libiconv’ 错误的解决方法

 

手动编译PHP安装时遇到如下错误
/usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close’ collect2: ld returned 1 exit status make: *** [sapi/fpm/php-fpm] 错误
 1 表面看,是libiconv安装问题,重装libiconv之后问题依旧,网上看有人舍弃libiconv,使用 –without-iconv,我觉的不可取,这样是回避问题。 找了n久,终于找到bug所在: 在执行完 ./configure … 之后,修改下 Makefile,找到其中的
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt
 在最后面添加 -liconv ,修改后如下
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -liconv

本文出自 “技术成就梦想” 博客,请务必保留此出处http://flyfishes.blog.51cto.com/3527694/819693

BULBING:3D视觉的创意台灯

一盏好看的台灯,会给房间带来不错的视觉效果,比如这款“3D”立体感的台灯——BULBING

BULBING是一款非常挑战大脑和眼睛的LED错觉台灯,它看似是个立体图案,实际上是一块厚度仅有5毫米的有机玻璃,每一块都通过激光雕刻出三维线性图案,点亮后会出现3D立体视觉效果。

它有各种图案,如气球、灯泡、骷髅头等形状,灯的底座是桦木胶合板,想要啥图案就换上相应的玻璃即可。特有的节能技术使灯泡寿命也变得很长,并且不会过热,换灯泡很容易。

目前,BULBING已在众筹平台Kickstarter上筹得超过十倍的资金,一个灯座加一个灯的价格约为30英镑(约318元),图案不同价格也不同。

4f35e312bdfd4b6698e4dfc47495af7c s_994fd9c2029540bc9b1f571d608108a4 s_ee854b2058db4be49470dc502fcb9bfc s_de3867ca870740cfb30822efc5259880 s_53d6c63dc23b47b6a1377de2ef9e9d18 s_0b2f4df12363457089a22eebbec8e034 s_0cffad2c74e344efaec1e5ffdd56e576 s_5bdbf2a572be4132908e5866f472d75e s_3b4b389521144409b6af2c344d9ab397 s_f54d980eb4d7426d8fa833956646684b

BULBING:3D视觉的创意台灯,首发于极客范 – GeekFan.net

跟我学姿势:极客教你如何科学的刷卡

13901407122925

 

首先用手机开闪光灯,定位芯片的位置,在用笔画出芯片位置。卡内构造是一个比较大的线圈连接一个小小的芯片,最重要的就是那个芯片,通俗来讲就是无线电波通过线圈激活IC卡芯片在将IC卡芯片数据发射出去或接受读写器的数据。

72761407122928 92111407122930

 

因为最开始的时候找不到剪刀只能用网线钳了,哈哈。

34521407122933

 

然后再将剪好的卡芯片放进了丙酮,就是溶解PVC的药水。泡几个小时就能把白白的外壳泡烂。注意不要直接用手触摸这是有毒的,最好用镊子抓出来。

45351407122936 90281407122938 82431407122941 98141407122944

 

把多余的塑料和原来的线圈用刀片分开。

10021407122946

 

然后用烙铁把锡和自己做的线圈焊接芯片上,放在IC卡器上测试是否能感应到(PS线圈太小的话很有可能感应不了的!!!!!)

98121407122949

 

把线圈和芯片放进手环U盘槽里。

25151407122952 83791407122954

 

假如说市面上的智能手环(如小米)内置IC芯片然后通过大杀器acr122u,或者用radiowar团队Proxmark3 复制到手环上刷各种卡时候直接上了一个档次.妈妈再也不用担心我的卡丢掉了!

一说到@radiowar团队就想吐槽一下.WiFiPineapple卖的好贵撒。然后我通过自己的努力以及某基友的帮助终于吧WiFiPineapple系统移植到自己屌丝机HG255D上karma居然不能正常工作了。这是芯片问题么?还是移植不完美.

跟我学姿势:极客教你如何科学的刷卡,首发于极客范 – GeekFan.net

PHP根据图片Orientation旋转图片

最近发现发送到微信公众平台的图片被旋转了90度,导致后续操作出错。后来仔细研究,发现用iphone前置摄像头拍出来的照片会自动镜像,而且会右旋90度,之前TX服务器会处理这种情况,貌似最近不干了,害客户抱怨我这里的问题。

然后开始研究服务器传回来照片的格式,发现exif里面Orientation的值为6,正好是右旋了90度,正好可以根据这个来自动调整图片。

首先读取exif值

$exif = exif_read_data($src, 0, true);

if($exif[‘IFD0’][‘Orientation’]==6){
flip($src,$src,-90);
}

其实还有其他方向,也可以根据这个来旋转,我这里只需要这么多。

另外附上flip方法

function flip($filename,$src,$degrees=90)
{
//读取图片
$data = @getimagesize($filename);
if($data==false)return false;
//读取旧图片
switch ($data[2]) {
case 1:
$src_f = imagecreatefromgif($filename);break;
case 2:
$src_f = imagecreatefromjpeg($filename);break;
case 3:
$src_f = imagecreatefrompng($filename);break;
}
if($src_f==””)return false;
$rotate = @imagerotate($src_f, $degrees,0);
if(!imagejpeg($rotate,$src,100))return false;
@imagedestroy($rotate);
return true;
}

 

万一你机器上面没有exif模块,参照我前一篇博文。

我是如何绕过Google和Facebook等大站的两步验证的

我记得在两年前,两步验证(2-Factor-Authentication, 2FA)变得非常普及并且在各大主流网站(Google, Facebook, Yahoo 等)广泛应用。那时我十六岁,天真的我想不通为什么这么天才的想法之前没有人想到过。在那时,我认为2FA就是一个可以保护自己的金色盾牌,它可以抵御那些最复杂的网络欺诈。

当两步验证依旧是你所使用的主要应用的金色盾牌时,我开始列出以下文档—我是如何用一系列的方法来绕过Google, Facebook, Yahoo, LinkedIn的两步验证以及几乎任何向语音信箱发送两步验证标记的服务的。

注:超过959万的澳大利亚Optus公司的手机用户会受到我下面所说的语音信箱的攻击。这959万使用两步验证的用户中任何一人,都很有可能会受到我下文所说的绕过两步验证的攻击。

两步验证的分析,概念以及流程

两步验证的分析

当将两步验证看做一个整体时,从一个攻击者的角度看来仅仅有这些东西。在我第一次对两步验证的分析中,我经常在想是否可能进行以下的攻击:

  • 暴力搜索两步验证的pin码(有一些服务,比如苹果,只有四位的pin,并且几乎没有任何频率的限制)。
  • 发现pin生成的漏洞。
  • 通过某种方法窃取两步验证后的session标记,这样攻击者可以不用通过两步验证就登录账户。

以上技术都是攻击的有效手段,但是通常没有人会使用,因为这些手段太老套了,已经有了相应的防御。

在我经历过这个初步测试的阶段后,我列举了更多的东西,意识到一定有一个弱点能够让我们完全避开两步验证。这个弱点就是语音信箱。

有些读者可能会知道为什么语音信箱容易出问题,因为他们可能听说过2009年英国某些名人的语音信箱被黑客攻击的丑闻。他们进入语音信箱的方式相当让人担心,分为以下几种:默认的语音信箱PIN,未设置语音信箱PIN以及拨打自己电话的方法—都在Sophos Security中写到过。

在另一起类似的事故中,Cloudflare公司的CEO也是通过语音信箱绕过两步验证的受害者之一。然而,在这一次事件中,攻击更为复杂,要求攻击者设法使得AT&T(美国电话电报公司)的员工将Matthew Prince的语音信箱重定向到一个假的语音信箱处。

­那些我用来登录到语音信箱账号(仅限于那些已经授权的用于测试的账号)的方法在很久以前我就写过了,并且执行起来并不难。

虽然进入语音信箱的方法受到越来越多的关注,但是这一方法并不适应部分国家的大多数网络。

概念及攻击流程

作为一个攻击者,你需要知道四件事情,才能进入被攻击者被两步验证保护的账号中。它们包括:

  • 被攻击者的用户名/邮箱和密码。
  • 被攻击者关联到两步验证服务的手机号。
  • 一个手机号欺诈服务。
  • 手机语音信箱远程登录的账号。

在现实中,作为一名富有经验的攻击者,以上四点要求并不难达到。获取用户名和密码可以通过任何传统的方法做到,获取关联的手机号码在现在也并不困难。

手机号欺诈服务,比如Spoofcard(可以显示虚假的手机号码的服务)仅仅花费十美元就可以多次使用并且可以获得手机语音信箱的端点。另外,如果想要避免Spoofcard的登记,他们可以雇佣VoIP服务,打电话人的ID可以是虚假的,作用是一样的。

攻击第一阶段:

  • 攻击者在支持两步验证的网络应用上登录被攻击者的账号。
  • 攻击者向被攻击者的手机号拨打电话(只需要20-30秒即可)
  • 在此之后立即选择两步验证的选项要求通过电话发送两步验证的验证码

由于被攻击者正在跟攻击者通话,两步验证的电话服务就会立即将验证码发送到被攻击者的语音信箱里。

这是第一个漏洞。我是这样认为的,大家或许不同意,但是我想不出别的使验证码发送到语音信箱的方法了。由于这种方法的易用性,这样做的时候有一点危险。根据过去几年的语音信箱黑客的情况来看,通过向语音信箱发送pin,看起来好像不用管下面我将要告诉你们的第二个漏洞,直接就可以绕过两步验证。

当被攻击者没有接两步验证的电话时,两步验证的pin码也会被发送到语音信箱中。

绕过两步验证的第二阶段实际上依赖所谓的语音信箱窃听/电话窃听。

上图是应用于澳大利亚的和我的整个第二部分的方法,它只是和上述移动服务运营商相对应(在未发现其他的运营商之前)。在图中,我展示了我认为容易受到语音信箱攻击的网络以及其他部分或者完全不易攻击的网络。

另外,我必须指出,英国的Three 和EE网络也很容易通过电子欺骗受到语音信箱攻击。这一点最近被英国的The Register证实。

完全易受攻击的:

Telco公司的自动数字识别(ANI)或者是Caller ID是用来判断呼叫者是否是语音信箱账户的合法拥有者。如果ANI或Caller ID和账户持有者相匹配,在进入语音信箱账户时系统就不会要求输入pin码。

在美国,可以不通过Caller ID来请求pin码,然而在澳大利亚,据我所知除非服务提供商从他们的服务上来解决问题,否则没有可以预防语音信箱受到欺诈攻击的办法。

  1. 通过网络语音电话业务运营商或者专门的欺诈服务提供商获得ANI/Caller ID欺诈服务。
  2. 在上文列出的所有的所有易受攻击的服务中,输入目标号码为+610411000321.
  3. 输入被攻击者的手机号作为要显示的Caller ID.
  4. 如果你在使用SpoofCard(可以显示虚假的手机号码的服务),你会收到一个手机号和一个访问码。拨打这个手机号码并输入访问码。
  5. 你会连接到被攻击者的语音信箱服务提供商的终端上。在这里输入被攻击者的手机号并按#键、
  6. 你现在会拥有被攻击者语音信箱的全部权限。这甚至包括可以改变用户pin码或者是欢迎音乐的权限。

为什么目标号码是+610411000321

  • 澳大利亚有三大主要的移动业务运营商:Telstra, Optus和Vodafone。
  •  Telstra, Optus和Vodafone可以转售他们的服务,因此业务可以拓展到其他的提供商处。
  • 所有的中间商用和Optus相同的主要服务(例如账号信息热线,语音信箱服务等)。
  • 因此,如果攻击者能够开发任何三个电信提供商其中的任何一个服务的话,每个下属的服务提供商也很有可能受影响。
  •  Optus呼叫语音信箱的主号码是“321”。
  • 然而,当进行欺诈攻击时,由于我们不能呼叫“321”我们需要远程号码去呼叫。
  •  Optus为在海外的用户提供了一个可以呼叫的远程号码,这个号码就是:+610411000321,并且这个可以作为任何提供欺诈服务的终端。

注意:Optus语音信箱中任何易被攻击的端点都已经被固定了,包括我曾经用来绕过他们的端点。

部分易受攻击/不易受到攻击的:

我说过Telstra, Virgin和 Vodafone是部分易受攻击或不易受到攻击的,因为我并没有机会彻底测试攻击语音信箱的能力。然而我的确知道:

  • Telstra不管是什么Caller ID或者是ANI都要求一个pin码,因此对于我上文描述的破解来说是安全的。
  • Vodafone在未设置pin码的情况下,如果我通过欺诈服务冒充你的号码拨打,会让我设置pin码或者是进入你的语音信箱。
  • Virgin Mobile我并未测试,然而由于它是Optus网络的一部分,因此它很有可能是易受攻击的。

你如果不确定你现在使用的是哪种网络,或者你想检查一下自己是否是易受攻击的,我的一个朋友((Aleksa Sarai)写了一段程序通过你的手机号来确定你的在澳大利亚的移动网络。你只需输入你的手机号然后点击check就可以了。

你可以在Github上找到检测移动网络的代码。


向谷歌安全团队揭露

谷歌是两步验证的早期使用者,它的全部服务都使用了两步验证。如果你所选择的电话公司在语音信箱安全方面管理非常严格的话,谷歌现在使用的两步验证系统还是非常安全的,但是谷歌所提供的两步验证可以绕过的概率其实是非常高的。

假设你现在已经阅读了上文中提到的破解步骤,使我能够绕过两步验证的Google, Facebook, Yahoo 等其他主要的支持两步验证服务的漏洞是当你不在线时,两步验证会发送两步验证标记到你的语音信箱中。单看这一点,这是个很小的问题,但是站在安全的角度上来看,这个漏洞是非常明显的。

语音信箱并未实现全球统一化,它的安全性也是一样的。每个电话公司都运行他们自己的语音信箱管理服务。

  1. 语音信箱服务的安全并不由谷歌管理而是由电话商管理。
  2. 一旦两步认证的标记或者OTP在语音信箱中,有许多可以攻击的因素,可以撤销标记而不改动谷歌端的数据。

如果你想看我和谷歌对话的全部邮件记录,你可以点击这里: google.pdf

注意:通过这个绕过两步验证的方法并不能不动声色地来盗取谷歌账户,因为很有可能一旦登录到支持两步验证的谷歌账户中就会自动向用户发送信息。在前面的步骤中你必须选择拨打电话的方式然后继续破解。这样很可能会引起受害者的警觉。

他们对我最初的破解的回复如下:

嗨,

谢谢你的错误报告。我们已经看了你提交的数据并且确信这不是谷歌产品的安全缺陷。这个攻击假设了一个易被盗取的密码,并且实际的易被攻击性是由于电话商提供的对语音信箱的保护不够充分导致的。请直接向电话商报告这些。

Regrads,

Jeremy

虽然我知道语音信箱系统不够安全这是电话商的错误,我仍然觉得谷歌把两步验证标记发送到语音信箱这一做法有缺陷,这是个很危险的做法,并且大部分2FA提供商都不这样做。因此,我作出了以下回复:

Hi, Jeremy,

 当我发现这些漏洞时,我完全理解并且我也和电话商在不断联系。

澳大利亚和英国的大部分电话商都只要求一个并未锁定的四位的pin码。然而,使用VoIP服务以及Asterisk AGI(http://www.voip-info.org/wiki/view/Asterisk+AGI)的一些脚本就在一天内可以进入语音信箱的账号。

实质上,虽然你说的“这一定是电话商的问题”是对的。这不仅意味着在最近四年里(或更多),在澳大利亚使用Optus提供的服务的人(澳大利亚的大部分人)是非常容易受到绕过两步验证攻击的,这也意味着许多国家的电信商也非常容易受相同种类的攻击。

我觉得把这个问题说成是一个纯粹的电话商的问题,会有点忽略掉两步验证并没有很好的理由来发送到个人的语音信箱里这个事实。另外,先不考虑由于外部的易受攻击性使得谷歌的两步验证可以被绕过这件事,谷歌这样做事实上还是会把敏感信息交给一个可能易受攻击的终端。

另外,在做了一些调查后,我能够跟Duosecurity 和Authy的专门负责两步验证的工作人员交流了。当我第一次发现谷歌发送两步验证的标记到语音信箱时,我非常肯定像Duosecurity 和Authy这样的两步验证服务提供商也是易受攻击的。但是我错了,他们并不会将两步验证标记发送到语音信箱。他们是这样处理这个问题的:

  • – 在通过语音发送PIN码或者两步验证标记时要求用户的某些交互行为。
  • – 在语音信箱留下一个空白信息而不是pin。
  • -要求用户的交互作为验证的方式(接到两步验证的电话->告诉用户按下数字键”x”->如果正确按下=确认,如果没有=未确认)

请让我知道你对此有何看法以及谷歌是否有应对这种情况的措施。十分显然这个问题是由于电话商的不安全的语音信箱服务造成的,然而这并不是谷歌或者是我可以控制的因此使得两步验证在某种程度下易受攻击。

两步验证对于那些将Optus手机号和谷歌账户绑定到一起的澳大利亚人来说是无效的,并且至少近四年是无效的(假设其他人已经知道Optus语音信箱的漏洞了)。

谢谢,

Shubham

谷歌很快回复道:

嗨,

感谢你解释这个问题的潜在作用域。

由于这并不是我们2SV系统在技术上的缺陷,我不确定我们能够做些什么来应对这个问题。但是我已经把一个bug记录下来并且会让团队成员来看一看。

Jeremy

假设这个问题不能修正,因此目前解决这个问题的最好方法就是禁用通过短信或者电话的两步验证,启用谷歌的两步验证,如果你绑定到手机就可能容易受到攻击。

这个设置方法可以在下面找到:https://accounts.google.com/b/0/SmsAuthSettings

另外,当不确定时,可以通过下面的方法通过两步验证来还原谷歌账户:

https://support.google.com/accounts/answer/183728
https://support.google.com/accounts/answer/152124

我自己还原账户时失败了,我的朋友也是一样的。然而一段时间以前,Matthew Prince (Cloudflare)成功地还原了账户。

状态: 仍然易受攻击/并不会修复 | 揭露时间: Wed, Apr 30, 2014 at 11:49 AM

———————————————————————————————————————————————————–

向Facebook安全团队揭露

因为我的一个失误,在这次揭露之前我刚刚意识到可以用攻击谷歌的类似方法来攻击Facebook。Facebook称他们的两步验证“Login Approvals”是一个类似于登录通知的特点,但是有额外的安全步骤。

用和上述步骤相同的流程来破解,同样可以绕过Facebook的两步验证。

 让Facebook发送验证码到语音信箱的步骤如下:

  1. 登录账户。
  2.  点击“通过短信发送验证码”。
  3. 会显示出拨打电话的选项。
  4. 通过拨打被攻击者电话或其他方法保证被攻击者处于通话状态。
  5.  点击“电话通知验证码”选项。
  6. 验证码会被发送到语音信箱中。

另外,除了上述模式,也可以通过向”https://www.facebook.com/ajax/login/approvals/send_sms“发送表单数据为”method_requested=phone_requested”的请求。

这个方法是通过截取最初发送短信的请求,将”sms_requested”替换为”phone_requested”来实现的,它是最有效地方法。

你可以在这里找到我向facebook 披露这个漏洞的完整版本facebook.pdf.

然而,他们对此的回复如下:

Shubham 你好,

我们目前暂时禁用了通过电话来发送登录验证码的功能,未来还将进一步研究。我们的计划是当可以实现用户在通话中的交互时再重新启用这一功能,这样就可以防止我们将验证码发送到语音信箱中。

Neal, Facebook 安全团队

 Facebook在我绕过两步验证之后迅速的禁用了部分功能,他们非常迅速地采取了措施,至少是临时的措施。

状态: 不再会受攻击| 揭露日期: Sun, May 11, 2014 at 10:28 AM


向 LinkedIn安全团队揭露

正如谷歌和Facebook一样,当被攻击者没有接到系统自动来电或者占线时LinkedIn就会将两步验证码发送到被攻击者的语音信箱中。

LinkedIn处理地很好,他们关闭了通过电话发送两步验证码这个功能,直到他们可以和第三方的两步验证提供商来修复这个问题。

你可以在这里看到我和LinkedIn发送的所有邮件linkedin.pdf.

他们对这一问题的主要回复如下:

Shubham,你好

感谢你在公开这个问题之前告诉我们。

虽然这个问题对我们的影响是有限的,但是我们暂时关闭了发送两步验证码的语音的功能。我们正在和第三方协商解决这个问题。在问题修复后,我们会考虑恢复语音功能。

谢谢,

David

状态: 不再会受攻击| 揭露日期: Wed, Apr 30, 2014 at 4:15 AM


向雅虎团队揭露 (通过HackerOne)

雅虎支持两步验证的主要服务也容易受到我上文中所说的攻击。事实上,对支持两步验证的雅虎账号的攻击会更严重因为攻击者并不用担心被攻击者知道他的账号已经登录。

通常支持两步验证的网络应用会在有人登录后发送短信通知。然而,当登录到雅虎账号以后,并不会发送短信,并且可以选择通过短信或者是电话来发送验证码。

由于攻击者不用冒着被立刻知道的风险,攻击者会更有可能登录更长时间。

当我揭示这个问题14天后,雅虎仍然没有回复,因此他们仍然很容易受到攻击。

在这里可以看到我揭示雅虎漏洞的全过程yahoo.pdf

状态: 仍然易受攻击/尚未回复 | 揭露日期: 2014-04-29 13:46:16 UTC


向 Authy & Duosecurity揭露

我很快假设那些提供两步验证的服务都一定是易受攻击的。然而,我是错误的—因为他们知道这个事实并且对发送pin码到语音信箱这个问题有着长远考虑。

你可以阅读我和Authy 及 Duosecurity的来往邮件 authy.pdf and duosecurity.pdf

这两个服务提供商都在24小时内给了我回复,并且他们对此都非常热心。

Authy | 状态:不易受攻击 | 揭露日期: Wed, Apr 30, 2014 at 1:27 AM

Duosecurity | 状态:不易受攻击 | 揭露日期: 2014-04-29 13:46:16 UTC

Authy会发送空白的语音信息,Duosecurity会在验证前要求用户的交互操作。

感谢AuthyDuosecurity!


缓解技术和向电话商 Telco 揭露:

广大的读者你们好,我校对了上面的一些信息,包括世界各地各种移动网络的终端。

由于我不能查对 Telco 的海外电话商,我 知道世界各地的人都关心他们的电话商是否是易受攻击的。

要看你是否可以通过欺诈服务不用pin码就进入语音信箱,仅需要跟着上午所说的流程来,将终端号码改为你的电话商用的。

如果你的电话商也容易受到攻击请通过邮件或者是评论来告诉我。

应对这个问题并没有想象中的那么简单,这要求重新构造两步验证的电话通知。这里是一些建议的解决方法(在给那些公司的邮件里都提到过):

  • 要求用户的交互作为验证(推荐)
  • 以语音信箱检测结束通话(不可靠)

最后也是最重要的:

  • 去除语音通话发送验证码的功能(减少了用户体验)

向 Optus揭露

我和Ben Grubb一起工作很愉快(The Sydney Morning Herald and The Age的编辑),他帮助我把这些问题反映给Optus并且在此过程中非常热心也很有合作精神。

当我第一次发现Optus是易受攻击的时候,我的研究让我注意到这篇文章thisIs your Voicemail Hackable? Optus, Telstra and Vodafone respond

Optus很严肃认真地对待顾客的隐私。顾客必须设置一个独一无二的PIN码来激活他们的语音信箱系统。当他们的PIN码被用户服务重新设置时,Optus会建议他们重新设置一个只有他们自己知道的PIN码。

至于欺诈服务,我们正在寻求多种方式来强调这一正在出现的整个工业界的威胁,包括技术上的解决途径以及进行对顾客的教育。

这篇文章的日期是2011年7月22号,距今已经三年了,令人惊讶的是这个问题依然存在并且是一个关于隐私的巨大隐患!

我和Ben在2014年3月2日将这个问题告诉了Optus,从那以后七天左右Optus修复了这个问题。

然而,在修复以后几个小时之内,我能够又一次找出不用pin就可以进入任何Optus顾客语音信箱的方法。Optus正在研究这样的绕过方法,但是在没有其他公告之前,如果你使用Optus或者其他使用他们网络的代理商的服务,请假设你的语音信箱是不安全的,比如Vaya, LiveConnected, Amaysim, Exetel, Yatango 等等。


备注

正如同我之前对于captchas, SSRFrate limiting的迷恋一样,我认为语音信箱和移动网络的安全会占用我未来的许多时间。

每个人都知道移动网络的安全性很差,但是都没有做出什么改变,直到我们因此受到侵害才能意识到这件事情的重要性。

如果你想要跟进我的语音信箱的研究,我会根据电话商的回复来定期更新我的twitter.

Follow @infosec_au

以下服务可能会受到影响,但是我并没有彻底去检测:

  • Snapchat
  • Egnyte (Uses DuoSecurity 2FA and hence is not vuln until further notice)
  • Amazon
  • Dynadot
  • Airbnb
  • Elance
  • Chase
  • Discover
  • Fairwinds

另外有已确认是易受攻击的:

感谢你的阅读,我希望你能够觉得这篇文章有用。

 

我是如何绕过Google和Facebook等大站的两步验证的,首发于博客 – 伯乐在线

php编译扩展

今天在php程序中要使用exif信息,发现服务器的php居然没有编译这个模块,网上找了个教程,在这里做个笔记,省得以后忘了。

cd [php-source-dir]/ext/exif/
export PHP_PREFIX=”[your php install full path]”
$PHP_PREFIX/bin/phpize
./configure –enable-exif=shared –with-php-config=$PHP_PREFIX/bin/php-config
make
make install

配置php.ini
extension=”…/exif.so”
或者设置extension_dir = “[so-path]” , extension=”exif.so”

重起nginx

用Wii+乐高积木打造安卓游戏手柄

如果你手边正好有多余的乐高积木以及一部任天堂Wii的话,就可以考虑为你的Android手机DIY一部游戏手柄了。如下图所示,它看起来或许略显简陋,但组装的过程才是乐趣所在。

s_5ab15c22c42943debb685d1f1909eea0

 

首先你要在一大堆的乐高零件中找出合适的部件拼装成可以用来固定手机和Wiimote手柄的框架,由于Wiimote外观设计方面的原因,只有一处地方可以用来固定而不影响到按键。

s_e7f014666f464e8090bc6331429d067f

 

想让Android设备和你的Wiimote融合起来,还需要一款名为Wiimote-link的安卓应用,需要注意的是该应用只支持Android 4.2及以上设备。

s_4b0fe633b1b149df882c034b2d695fb6

 

理论上使用PS3手柄也是可以的,但由于PS3手柄的造型不如Wiimote来得方正,不适合使用乐高积木进行固定。

用Wii+乐高积木打造安卓游戏手柄,首发于极客范 – GeekFan.net

酷毙了!看看这些机械昆虫

艺术家贾斯汀祖父的铁路工人,爸爸是计算机迷。他从童年开始生活周围就被机械的东西包围着。长大了后,他仍然热爱将机械小零件拆卸,制作出新的东西非常迷人的。下面这些小蜘蛛,苍蝇,蝎子和螳螂等就是他的“机械”雕塑。

蜻蜓

20140512190328_30824

 

蝎子

20140512190328_89098

 

蜘蛛

20140512190329_60833

 

甲虫

20140512190329_32909 20140512190329_92732

 

这个蜘蛛说不定会发光哦

20140512190329_25191

 

这个双头昆虫,太酷了!

20140512190329_30544 20140512190329_44499

 

这个是一个脑袋的

20140512190330_56730

 

苍蝇

20140512190330_89076

 

膛螂

20140512190330_69688 20140512190330_64352 20140512190330_21255

 

蚊子

20140512190330_30442

 

甲虫

20140512190331_74204

 

机械怪兽

20140512190331_89653

 

蝎子

20140512190331_39745

 

蝗虫

20140512190331_93976

 

其实咱们没事也可以研究研究做些好玩的东西,买个小电焊,20块左右,在弄点零件和铁丝,一个个让人爱不释手的小玩意就可以诞生了。

酷毙了!看看这些机械昆虫,首发于极客范 – GeekFan.net