前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解Amazon Alexa Skill(二)

深入理解Amazon Alexa Skill(二)

作者头像
ascii0x03
发布2019-03-19 16:12:34
1.5K0
发布2019-03-19 16:12:34
举报
文章被收录于专栏:ascii0x03的安全笔记

理解skill调用

本节来更详细的讨论alexa是如何确定调用哪个skill的。 参考:https://developer.amazon.com/zh/docs/custom-skills/understanding-how-users-invoke-custom-skills.html

明确调用(Specific Request (Intent))

用户在语音中明确的包含了要调用的skill的名字,云会给skill发送一个带有具体intent的 IntentRequest。用户可以有很多种表达方式来明确的调用skill,包括疑问句、祈使句等等,甚至不带具体的请求内容只是呼唤skill的名字。这些都由Alexa来自动处理。Alexa预设了一些调用的表达方式,例如

<some action> <connecting word> <invocation name> e.g.“give me my Taurus horoscope using Daily Horoscopes” Ask <invocation name> <connecting word> <some action> e.g.“Ask Daily Horoscopes to give me the horoscope for Taurus” Start <invocation name> and <some action> e.g.“Start Daily Horoscopes and give me the horoscope for Taurus”

这里主要潜在的安全问题就是skill的调用名称的处理了,恶意skill要与正常skill争夺谁被调用。

隐式调用(Name-free Interaction)(beta测试功能)

第二种比较有意思的是隐式调用,用户不需要明确说出想要调用的skill,由Alexa来自动寻找调用合适的skill。大体流程如下:

  1. 用户做出请求行为后,Alexa解析请求,并将请求发送给排名靠前的候选skill,向这些skill来发送CanFulfillIntentRequest 询问是否可以处理该intent。
  2. 如果skill实现了canFulfillIntent,skill此时不应该做出任何实际操作,包括开关灯、播放音乐等等。
  3. Alexa收集响应看哪个skill合适,选择后再发送IntentRequest给被选中的skill。
  4. 收到IntentRequest的skill再回复用户执行具体的操作。

所以,如果skill想要被隐式调用的话,就要实现CanFulfillIntentRequest接口,userId不会在调用这个接口的时候就传入。这就相当于,Alexa会将用户的intent广播给所有注册了的skill,似乎发给恶意的skill会有一些隐私问题,虽然文档说canFulfillIntent时不应该做出实际操作,但是skill此时是否可以悄悄地发送用户的intent? 官网中的CanFulfillIntentRequest 请求例子如下

代码语言:javascript
复制
{
  "request": {
    "type": "CanFulfillIntentRequest",
    "requestId": "...",
    "intent": {
      "name": "PlaySound",
      "slots": {
        "Sound": {
          "name": "Sound",
          "value": "crickets"
        }
      },
    },
    "locale": "en-US",
    "timestamp": "..."
  },
  "context": {
    "System": {
      "application": {
        "applicationId": "amzn1.ask.skill.<skill-id-value>"
      },
      "user": {
        "userId": "<user-id-value>"
      },
      "device": {
        "supportedInterfaces": {}
      }
    }
  },
  "version": "1.0"
}

skill需要使用canFulfillIntent来响应Alexa发出的CanFulfillIntentRequest,设置canFulfill = "YES"/"NO"/"MAYBE" 来表明本skill是否能处理这个用户的intent。 这个完全也是靠skill自己自觉来回应的,Alexa似乎还没有能力来进一步的确认skill是不是真的有能力?此外,skill的响应和Alexa系统的请求是如何认证保证不被伪造的? 一个intent响应的例子如下:

代码语言:javascript
复制
{
    "version":"1.0",
    "response":{
        "canFulfillIntent": {
            "canFulfill": "YES",
            "slots":{
                "slotName1": {
                    "canUnderstand": "YES",
                    "canFulfill": "YES"
                },
               "slotName2": {
                    "canUnderstand": "YES",
                    "canFulfill": "YES"
                }
            }
        }
    }
}

亚马逊文档其实在这里给出了答案。亚马逊发来的JSON里会携带一个Application ID,服务端skill的代码要自己检查发来的请求中的Application ID是否与自己Skill ID一样,如果一致才执行,不一致就回复一个HTTP的400 Bad Request。也就是说Skill的ID是个秘密(像这样amzn1.ask.skill.661ecf07-280b-41fe-8fe4-8c5fbCCCCCC)。因此,能否找到泄露的Skill ID,或者开发者是否忘记了检查Skill ID,就是能否伪造Alexa调用Skill请求的关键了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理解skill调用
    • 明确调用(Specific Request (Intent))
      • 隐式调用(Name-free Interaction)(beta测试功能)
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档