Zhuang's Diary

言之有物,持之以恒

工具介绍

Burp 抓包,改包工具, 基于java,运行,需要JRE
需要搭梯子才能登录其网站主页,美国公司,商业软件,年费399年费,有社区开源版本

Burp未启动时,网络的路由环境
本地(浏览器) — 服务器
Burp启动后,网络的路由环境
本地(浏览器 — Burp) — 服务器
Burp extensions — https://github.com/snoopysecurity/awesome-burp-extensions

DVWA靶场,里面是各种漏洞攻击的介绍和说明,是一个入门的联系资源,英文资源。

Pikachu 漏洞练习平台,同理,中文资源。

https://www.kali.org/ , 一个Linux发行版本,是专门针对各种信息安全任务或者练习而准备的。

前端一切不可靠,如上Burp在客户端做网络流量拦截,做中间人攻击

对应的措施:
1.后端校验;2.前端不做逻辑判断;3.前端加密混淆;4.移动端加壳;5.反调试检测,防止逆向工程; 6.后台数据库存储字段最好经过KMS后端密文,常见的服务器本地算法 — hash(明文+盐值)
通常,www.website.com/robots.txt,如 https://www.bilibili.com/robots.txt ,很多网站都有这样子一个网站URL的列表,表示本网站允许访问的URL。

Burp 启动浏览器,在网站的http://burp/地址,
在网页右上角点击CA Certificate 下载Burp颁发的证书。

Burp暴力破解,尝试用户名和密码时,可以使用“Repeater”和“Intruder”两个菜单的功能。
通常登录成功后,response 的长度会有不同。

暴力破解的本质是 自动化,大量发送请求,猜测密码。
应对方法:
1.要求用户密码设置的复杂度;
2.识别爬虫/机器人:验证码,滑块,随机验证码;
3.限制登录频率:每次登录n秒以上方可,错误m次后冻结该用户x分钟,这样会带来问题:
A.前端限制,通过重置本地数据可以绕过;
B.IP地址限制,可能会误封正常用户,攻击者租用地址池拥有大量IP。
C.账号限制,会造成正常用户无法登录,恶意攻击者可以制造拒绝服务攻击。
4.增加密码强度,特别是增加密码长度是最有效的强度。
A.密码一户一用,避免一个密码到处使用,避免撞库攻击。
密码的本质是进行身份验证的手段。
密码的应用场景是基于以下假设:只有用户和服务器知道该密码
其他方式验证身份:短信验证码,指纹,面部识别,USBKEY,2FA,多因子验证等等。

社会工程

黑客通过社会工程学(Social Engineering)实现攻击的手法多种多样,主要是利用人类的心理弱点和信任机制来获取信息或访问权限。
钓鱼攻击,尾随攻击,假冒身份,电话攻击,非技术性攻击,社交媒体欺骗,媒体投影攻击,关系建立攻击等等。

OWASP — Open Web Application Security Project

OWASP Top 10 提供了Web 安全领域发生最频繁的10种事故。最新版本是 2021 年发布的 — https://owasp.org/Top10/zh_CN/

WebShell - 以网页形式实现shell的功能,能够对系统进行操作。例如,文件读写,命令执行等。也被称为网页木马。
首先,网站如果对用户上传的文件,不做控制,黑客则有可能会上传木马文件,黑客通过木马文件控制后台服务器,如下,
通过 https://github.com/AntSwordProject/ 工具可以执行网页木马。

执行木马 成功,成功访问到后端服务器的目录和文件。

仅仅依赖客户端 JavaScript 验证和服务器端 MIME 类型检查仍然不够安全,因为客户端验证很容易被绕过,而且 MIME 类型本身也可能被伪造,尽管概率较低。 为了构建一个更加严谨的文件上传系统,需要采取更全面的安全措施,将验证和安全检查融入整个上传流程的各个阶段。

一个更严谨的文件上传系统应该包含以下措施:

  1. 客户端验证 (加强):
    文件类型检查 (加强): 虽然 file.type 相对可靠,但仍然不是绝对安全的。 可以考虑结合一些额外的检查:
    文件头部信息检查: 读取文件的前几个字节,检查是否符合已知的文件格式规范。 这需要对不同文件类型的头部结构有深入的了解。 但这仍然只能作为辅助手段,不能完全依赖。
    更严格的正则表达式: 使用更精确的正则表达式来验证文件名,但这仍然不能防止恶意文件伪装。
    文件大小限制: 设置一个合理的文件大小限制,并进行客户端验证。
    用户反馈: 提供清晰的用户反馈,告知用户文件上传失败的原因,例如文件类型不允许、文件大小超过限制等。
    禁止直接拖拽上传: 避免用户直接拖拽文件到上传区域,强制用户通过“选择文件”按钮选择文件,这样可以更好地控制文件上传过程。
  2. 服务器端验证 (多层防御):
    文件类型检查 (多重验证): 不要仅仅依靠 MIME 类型,结合多种方法进行验证:
    文件签名: 检查文件的魔术数字 (magic number),这是一种非常可靠的方法。 不同的文件格式通常有独特的魔术数字。
    文件内容分析: 对于一些关键的文件类型,可以进行更深入的内容分析,检查文件结构是否符合规范。 这需要根据具体的文件类型定制相应的分析方法。 这可能需要耗费较多资源。
    文件大小限制: 设置严格的文件大小限制,防止资源耗尽攻击(Denial of Service,DoS)。
    临时文件存储: 将上传的文件先保存到一个临时目录,然后再进行后续处理,这样可以避免恶意文件直接影响服务器。
    文件扩展名检查 (补充): 虽然不完全可靠,但作为附加的检查,可以辅助判断文件的类型。
    内容安全扫描 (关键): 使用专业的安全扫描工具,扫描上传的文件是否包含恶意代码、病毒或其他有害内容。 这可能是最关键的安全步骤,但会增加系统复杂性和成本。 一些云服务提供商提供此类服务。
    白名单机制: 只允许特定类型的文件上传。 尽量避免使用黑名单,因为黑名单很难完全覆盖所有的恶意文件类型。
    沙盒环境: 在沙盒环境中执行文件分析,以最大程度地限制恶意代码对服务器的影响。
    日志记录: 记录所有的文件上传事件,包括文件名、MIME 类型、文件大小、上传时间以及验证结果。 这有助于追踪和分析安全事件。
  3. 其他安全措施:
    HTTPS: 使用 HTTPS 加密上传过程,防止数据被窃取。
    输入验证: 对所有用户输入进行严格的验证,防止注入攻击。
    代码安全审计: 定期对代码进行安全审计,查找和修复潜在的安全漏洞。
    服务端代码示例,如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    package main

    import (
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
    "path/filepath"
    "regexp"
    "strings"

    "github.com/gabriel-vasile/mimetype" // 用于更准确的 MIME 类型检测
    "github.com/google/uuid" // 用于生成唯一的文件名
    )

    // AllowedMimeTypes 定义允许上传的文件类型
    var AllowedMimeTypes = map[string]bool{
    "image/jpeg": true,
    "image/png": true,
    "image/gif": true,
    // 添加其他允许的 MIME 类型
    }

    // MaxFileSize 定义允许上传的最大文件大小 (字节)
    const MaxFileSize = 10 * 1024 * 1024 // 10MB

    // uploadHandler 处理文件上传请求
    func uploadHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
    http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
    return
    }

    file, handler, err := r.FormFile("file") // 假设表单字段名为 "file"
    if err != nil {
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
    }
    defer file.Close()

    // 客户端验证 (加强)
    fileName := handler.Filename
    if !isValidFileName(fileName) { // 检查文件名是否合法
    http.Error(w, "Invalid file name", http.StatusBadRequest)
    return
    }

    fileSize := handler.Size
    if fileSize > MaxFileSize {
    http.Error(w, "File too large", http.StatusRequestEntityTooLarge)
    return
    }

    // 服务器端验证 (多层防御)
    detectedMimeType, err := mimetype.DetectReader(file)
    if err != nil {
    http.Error(w, "Failed to detect MIME type", http.StatusInternalServerError)
    return
    }

    if !AllowedMimeTypes[detectedMimeType.String()] {
    http.Error(w, "Invalid file type", http.StatusBadRequest)
    return
    }

    // 使用 UUID 生成唯一的文件名,避免文件名冲突
    newFileName := uuid.New().String() + filepath.Ext(fileName)
    uploadPath := "./uploads/" + newFileName // 定义上传文件的存储路径

    // 创建上传目录,如果不存在
    os.MkdirAll("./uploads/", 0755)

    // 创建文件并保存
    newFile, err := os.Create(uploadPath)
    if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
    }
    defer newFile.Close()

    _, err = io.Copy(newFile, file)
    if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
    }

    // 此处添加更严格的安全检查,例如:
    // 1. 使用第三方库进行病毒扫描 (ClamAV, VirusTotal API 等)
    // 2. 更深入的文件内容分析,根据文件类型进行特定检查

    fmt.Fprintf(w, "File uploaded successfully: %s\n", newFileName)
    }

    // isValidFileName 检查文件名是否合法,防止目录遍历攻击等
    func isValidFileName(fileName string) bool {
    re := regexp.MustCompile(`^[a-zA-Z0-9._-]+$`) // 只允许字母、数字、点、下划线和短横线
    return re.MatchString(fileName)
    }

    func main() {
    http.HandleFunc("/upload", uploadHandler)
    fmt.Println("Server listening on port 8080")
    http.ListenAndServe(":8080", nil)
    }
    AllowedMimeTypes: 定义了允许上传的文件类型,使用 map[string]bool 更易于管理。
    MaxFileSize: 设置了最大文件大小限制。
    mimetype 库: 使用了 github.com/gabriel-vasile/mimetype 库来更准确地检测 MIME 类型。 这比只依赖 handler.Header.Get(“Content-Type”) 更可靠。
    UUID 生成文件名: 使用 UUID 生成唯一的文件名,避免文件名冲突和潜在的安全问题。
    isValidFileName 函数: 对文件名进行简单的验证,防止目录遍历等攻击。 这只是一个基本的示例,实际应用中可能需要更复杂的验证规则。
    临时文件存储 (缺失但建议): 为了更安全,应该先将文件保存到临时目录,验证通过后再移动到最终存储位置。
    安全扫描 (缺失但必须): 代码中用注释标注了需要添加安全扫描的地方。 你需要集成一个专业的安全扫描库或服务 (例如 ClamAV, VirusTotal API 等) 来扫描上传的文件是否包含恶意代码。 这是至关重要的安全步骤。

Linux 系统排查

1.查看用户行为
/etc/passwd,/etc/shadow 中存储了account和密码信息,黑客可能会增加高权限用户在如上两个文件夹中
如 macOS 中,
➜  ~ sudo dscl . -list /Users | while read user; do sudo dscl . -read /Users/“$user” UserShell | grep -q ‘/bin/bash’ && echo $user; done
_mbsetupuser
postgres
➜  ~ last
Zzz  ttys000                         Tue Dec 10 14:05   still logged in
Zzz  ttys000                         Mon Dec  9 11:29 - 11:29  (00:00)
Zzz  ttys000                         Sat Dec  7 19:35 - 19:35  (00:00)
Zzz  console                         Tue Dec  3 14:51   still logged in
reboot time                                Tue Dec  3 14:50
还有,如查看用户的密码是否为空,用户执行过的命令,等等。
3.查看进程,例如,黑客通过服务器在挖矿等异常。lspf, top等命令。
更多可以查看 Linux 应急响应手册 — https://github.com/Just-Hack-For-Fun/Linux-INCIDENT-RESPONSE-COOKBOOK

威胁情报中心:

Windows 系统工具 - https://learn.microsoft.com/en-us/sysinternals/
腾讯威胁情报中心 - https://tix.qq.com/
可疑文件分析 - https://www.virustotal.com/gui/home/upload

https://github.com/cline/cline/blob/main/src/core/prompts/system.ts
IDE 中的自主编码代理-Autonomous coding agent,能够在每一步中在您的许可下创建/编辑文件、执行命令、使用浏览器等。Autonomous coding agent core prompts are here:

Who you are

1
You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.

execute_command

1
2
3
Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Commands will be executed in the current working directory: ${cwd.toPosix()}
Parameters:
- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.

read_file

1
2
3
Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string.
Parameters:
- path: (required) The path of the file to read (relative to the current working directory ${cwd.toPosix()})

write_to_file

1
2
3
4
Description: Request to write content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file.
Parameters:
- path: (required) The path of the file to write to (relative to the current working directory ${cwd.toPosix()})
- content: (required) The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified.

search_files

1
2
3
4
5
Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context.
Parameters:
- path: (required) The path of the directory to search in (relative to the current working directory ${cwd.toPosix()}). This directory will be recursively searched.
- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax.
- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*).

list_files

1
2
3
4
Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not.
Parameters:
- path: (required) The path of the directory to list contents for (relative to the current working directory ${cwd.toPosix()})
- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only.

list_code_definition_names

1
2
3
Description: Request to list definition names (classes, functions, methods, etc.) used in source code files at the top level of the specified directory. This tool provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture.
Parameters:
- path: (required) The path of the directory (relative to the current working directory ${cwd.toPosix()}) to list top level source code definitions for.

browser_action

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Description: Request to interact with a Puppeteer-controlled browser. Every action, except \`close\`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action.
-The sequence of actions **must always start with** launching the browser at a URL, and **must always end with** closing the browser. If you need to visit a new URL that is not possible to navigate to from the current webpage, you must first close the browser, then launch again at the new URL.
-While the browser is active, only the \`browser_action\` tool can be used. No other tools should be called during this time. You may proceed to use other tools only after closing the browser. For example if you run into an error and need to fix a file, you must close the browser, then use other tools to make the necessary changes, then re-launch the browser to verify the result.
-The browser window has a resolution of **900x600** pixels. When performing any click actions, ensure the coordinates are within this resolution range.
-Before clicking on any elements such as icons, links, or buttons, you must consult the provided screenshot of the page to determine the coordinates of the element. The click should be targeted at the **center of the element**, not on its edges.
Parameters:
-action: (required) The action to perform. The available actions are:
* launch: Launch a new Puppeteer-controlled browser instance at the specified URL. This **must always be the first action**.
- Use with the \`url\` parameter to provide the URL.
- Ensure the URL is valid and includes the appropriate protocol (e.g. http://localhost:3000/page, file:///path/to/file.html, etc.)
* click: Click at a specific x,y coordinate.
- Use with the \`coordinate\` parameter to specify the location.
- Always click in the center of an element (icon, button, link, etc.) based on coordinates derived from a screenshot.
* type: Type a string of text on the keyboard. You might use this after clicking on a text field to input text.
- Use with the \`text\` parameter to provide the string to type.
* scroll_down: Scroll down the page by one page height.
* scroll_up: Scroll up the page by one page height.
* close: Close the Puppeteer-controlled browser instance. This **must always be the final browser action**.
- Example: \`<action>close</action>\`
-url: (optional) Use this for providing the URL for the \`launch\` action.
* Example: <url>https://example.com</url>
-coordinate: (optional) The X and Y coordinates for the \`click\` action. Coordinates should be within the **900x600** resolution.
* Example: <coordinate>450,300</coordinate>
-text: (optional) Use this for providing the text for the \`type\` action.
* Example: <text>Hello, world!</text>

ask_followup_question

1
2
3
4
5
6
7
Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth.
Parameters:
- question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need.
Usage:
<ask_followup_question>
<question>Your question here</question>
</ask_followup_question>

attempt_completion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. Optionally you may provide a CLI command to showcase the result of your work. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again.
IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user that any previous tool uses were successful. Failure to do so will result in code corruption and system failure. Before using this tool, you must ask yourself in <thinking></thinking> tags if you've confirmed from the user that any previous tool uses were successful. If not, then DO NOT use this tool.
Parameters:
- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance.
- command: (optional) A CLI command to execute to show a live demo of the result to the user. For example, use \`open index.html\` to display a created html website, or \`open localhost:3000\` to display a locally running development server. But DO NOT use commands like \`echo\` or \`cat\` that merely print text. This command should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions.

# Tool Use Examples

## Example 1: Requesting to execute a command

<execute_command>
<command>npm run dev</command>
</execute_command>

## Example 2: Requesting to write to a file

<write_to_file>
<path>frontend-config.json</path>
<content>
{
"apiEndpoint": "https://api.example.com",
"theme": {
"primaryColor": "#007bff",
"secondaryColor": "#6c757d",
"fontFamily": "Arial, sans-serif"
},
"features": {
"darkMode": true,
"notifications": true,
"analytics": false
},
"version": "1.0.0"
}
</content>
</write_to_file>

Tool Use Guidelines

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1 In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
2. Choose the most appropriate tool based on the task and the tool descriptions provided. Assess if you need additional information to proceed, and which of the available tools would be most effective for gathering this information. For example using the list_files tool is more effective than running a command like \`ls\` in the terminal. It's critical that you think about each available tool and use the one that best fits the current step in the task.
3. If multiple actions are needed, use one tool at a time per message to accomplish the task iteratively, with each tool use being informed by the result of the previous tool use. Do not assume the outcome of any tool use. Each step must be informed by the previous step's result.
4. Formulate your tool use using the XML format specified for each tool.
5. After each tool use, the user will respond with the result of that tool use. This result will provide you with the necessary information to continue your task or make further decisions. This response may include:
- Information about whether the tool succeeded or failed, along with any reasons for failure.
- Linter errors that may have arisen due to the changes you made, which you'll need to address.
- New terminal output in reaction to the changes, which you may need to consider or act upon.
- Any other relevant feedback or information related to the tool use.
6. ALWAYS wait for user confirmation after each tool use before proceeding. Never assume the success of a tool use without explicit confirmation of the result from the user.

It is crucial to proceed step-by-step, waiting for the user's message after each tool use before moving forward with the task. This approach allows you to:
1. Confirm the success of each step before proceeding.
2. Address any issues or errors that arise immediately.
3. Adapt your approach based on new information or unexpected results.
4. Ensure that each action builds correctly on the previous ones.

By waiting for and carefully considering the user's response after each tool use, you can react accordingly and make informed decisions about how to proceed with the task. This iterative process helps ensure the overall success and accuracy of your work.

CAPABILITIES

1
2
3
4
5
6
7
8
9
10
11
12
-You have access to tools that let you execute CLI commands on the user's computer, list files, view source code definitions, regex search${
supportsComputerUse ? ", use the browser" : ""
}, read and write files, and ask follow-up questions. These tools help you effectively accomplish a wide range of tasks, such as writing code, making edits or improvements to existing files, understanding the current state of a project, performing system operations, and much more.
- When the user initially gives you a task, a recursive list of all filepaths in the current working directory ('${cwd.toPosix()}') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current working directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop.
- You can use search_files to perform regex searches across files in a specified directory, outputting context-rich results that include surrounding lines. This is particularly useful for understanding code patterns, finding specific implementations, or identifying areas that need refactoring.
- You can use the list_code_definition_names tool to get an overview of source code definitions for all files at the top level of a specified directory. This can be particularly useful when you need to understand the broader context and relationships between certain parts of the code. You may need to call this tool multiple times to understand various parts of the codebase related to the task.
- For example, when asked to make edits or improvements you might analyze the file structure in the initial environment_details to get an overview of the project, then use list_code_definition_names to get further insight using source code definitions for files located in relevant directories, then read_file to examine the contents of relevant files, analyze the code and suggest improvements or make necessary edits, then use the write_to_file tool to implement changes. If you refactored code that could affect other parts of the codebase, you could use search_files to ensure you update other files as needed.
- You can use the execute_command tool to run commands on the user's computer whenever you feel it can help accomplish the user's task. When you need to execute a CLI command, you must provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, since they are more flexible and easier to run. Interactive and long-running commands are allowed, since the commands are run in the user's VSCode terminal. The user may keep commands running in the background and you will be kept updated on their status along the way. Each command you execute is run in a new terminal instance.${
supportsComputerUse
? "\n- You can use the browser_action tool to interact with websites (including html files and locally running development servers) through a Puppeteer-controlled browser when you feel it is necessary in accomplishing the user's task. This tool is particularly useful for web development tasks as it allows you to launch a browser, navigate to pages, interact with elements through clicks and keyboard input, and capture the results through screenshots and console logs. This tool may be useful at key stages of web development tasks-such as after implementing new features, making substantial changes, when troubleshooting issues, or to verify the result of your work. You can analyze the provided screenshots to ensure correct rendering or identify errors, and review console logs for runtime issues.\n - For example, if asked to add a component to a react website, you might create the necessary files, use execute_command to run the site locally, then use browser_action to launch the browser, navigate to the local server, and verify the component renders & functions correctly before closing the browser."
: ""
}

RULES

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- Your current working directory is: ${cwd.toPosix()}
- You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '${cwd.toPosix()}', so be sure to pass in the correct 'path' parameter when using tools that require a path.
- Do not use the ~ character or $HOME to refer to the home directory.
- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`.
- When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes.
- When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser.
- Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write.
- When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices.
- When you want to modify a file, use the write_to_file tool directly with the desired content. You do not need to display the content before using the tool.
- Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again.
- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves.
- When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you.
- The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it.
- Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation.${
supportsComputerUse
? '\n- The user may ask generic non-development tasks, such as "what\'s the latest news" or "look up the weather in San Diego", in which case you might use the browser_action tool to complete the task if it makes sense to do so, rather than trying to create a website or using curl to answer the question.'
: ""
}
- NEVER end attempt_completion result with a question or request to engage in further conversation! Formulate the end of your result in a way that is final and does not require further input from the user.
- You are STRICTLY FORBIDDEN from starting your messages with "Great", "Certainly", "Okay", "Sure". You should NOT be conversational in your responses, but rather direct and to the point. For example you should NOT say "Great, I've updated the CSS" but instead something like "I've updated the CSS". It is important you be clear and technical in your messages.
- When presented with images, utilize your vision capabilities to thoroughly examine them and extract meaningful information. Incorporate these insights into your thought process as you accomplish the user's task.
- At the end of each user message, you will automatically receive environment_details. This information is not written by the user themselves, but is auto-generated to provide potentially relevant context about the project structure and environment. While this information can be valuable for understanding the project context, do not treat it as a direct part of the user's request or response. Use it to inform your actions and decisions, but don't assume the user is explicitly asking about or referring to this information unless they clearly do so in their message. When using environment_details, explain your actions clearly to ensure the user understands, as they may not be aware of these details.
- Before executing commands, check the "Actively Running Terminals" section in environment_details. If present, consider how these active processes might impact your task. For example, if a local development server is already running, you wouldn't need to start it again. If no active terminals are listed, proceed with command execution as normal.
- When using the write_to_file tool, ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project.
- It is critical you wait for the user's response after each tool use, in order to confirm the success of the tool use. For example, if asked to make a todo app, you would create a file, wait for the user's response it was created successfully, then create another file if needed, wait for the user's response it was created successfully, etc.${
supportsComputerUse
? " Then if you want to test your work, you might use browser_action to launch the site, wait for the user's response confirming the site was launched along with a screenshot, then perhaps e.g., click a button to test functionality if needed, wait for the user's response confirming the button was clicked along with a screenshot of the new state, before finally closing the browser."
: ""
}

OBJECTIVE

1
2
3
4
5
6
7
8
9
10
You accomplish a given task iteratively, breaking it down into clear steps and working through them methodically.

1. Analyze the user's task and set clear, achievable goals to accomplish it. Prioritize these goals in a logical order.
2. Work through these goals sequentially, utilizing available tools one at a time as necessary. Each goal should correspond to a distinct step in your problem-solving process. You will be informed on the work completed and what's remaining as you go.
3. Remember, you have extensive capabilities with access to a wide range of tools that can be used in powerful and clever ways as necessary to accomplish each goal. Before calling a tool, do some analysis within <thinking></thinking> tags. First, analyze the file structure provided in environment_details to gain context and insights for proceeding effectively. Then, think about which of the provided tools is the most relevant tool to accomplish the user's task. Next, go through each of the required parameters of the relevant tool and determine if the user has directly provided or given enough information to infer a value. When deciding if the parameter can be inferred, carefully consider all the context to see if it supports a specific value. If all of the required parameters are present or can be reasonably inferred, close the thinking tag and proceed with the tool use. BUT, if one of the values for a required parameter is missing, DO NOT invoke the tool (not even with fillers for the missing params) and instead, ask the user to provide the missing parameters using the ask_followup_question tool. DO NOT ask for more information on optional parameters if it is not provided.
4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built.
5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance.`

export function addCustomInstructions(customInstructions: string): string {
return `

Programmability in the context of Central Bank Digital Currencies (CBDCs) refers to the capacity to embed smart contract-like features directly into the digital currency. This would allow CBDCs to automatically execute rules or conditions when specific criteria are met, enabling more advanced use cases and controls.
Here are some practical business cases where the programmability of CBDCs could have significant impact:

1. Supply Chain Finance and Trade Settlement
供应链金融和贸易结算
In supply chain finance, CBDCs could be programmed to release payments automatically at each stage of production or delivery. For example:
Smart Contracts for Automatic Payment: A CBDC could be programmed to release funds when a shipment reaches a specific location or when an IoT-enabled device confirms the delivery of goods.
International Trade Compliance: By incorporating compliance checks within the CBDC, customs duties and taxes could be deducted automatically, while ensuring adherence to trade regulations, improving speed, and reducing paperwork.

2. Conditional Government Aid and Welfare Programs
有条件的政府援助和福利计划
Governments can disburse funds directly through programmable CBDCs with built-in conditions for usage. This use case would:
Ensure Targeted Spending: Welfare payments could be restricted to authorized merchants or for specific categories (e.g., groceries, health services), reducing misuse and ensuring assistance reaches the intended recipients.
Automatic Expiration or Limits: To encourage timely spending, certain stimulus payments could have expiration dates or be programmed to prevent hoarding, boosting economic activity.

3. Automated Tax Collection for Businesses and Consumers
企业和消费者自动征税
For businesses, CBDCs can simplify tax compliance through automated deductions:
Real-Time Tax Deduction: Taxes could be deducted in real-time during each transaction, simplifying tax compliance and reducing the administrative burden for small businesses.
VAT and Sales Tax: CBDCs could automatically calculate and remit VAT or sales tax directly to government accounts, reducing errors and ensuring compliance.

4. Real Estate and Asset Tokenization
房地产和资产代币化
Programmable CBDCs can streamline large, complex transactions like real estate purchases:
Escrow Mechanisms for Property Sales: CBDCs can serve as programmable escrow funds, where funds are only released when all contractual conditions, like title transfer or inspections, are fulfilled.
Fractional Ownership and Dividends: Asset tokenization (e.g., in real estate) could enable CBDCs to automatically distribute dividends to token holders, representing fractional property ownership.

5. Cross-Border Trade and Remittances
跨境贸易和汇款
CBDCs can simplify cross-border payments by integrating automatic conversion and compliance features:
Instant Cross-Currency Settlement: Programmable CBDCs could automatically convert funds to the recipient’s currency, applying relevant fees or exchange rates instantly.
Compliance Checks for AML/KYC: Programmable CBDCs could enforce AML/KYC requirements by automatically flagging suspicious activity, reducing regulatory risk and speeding up international transactions.

6. Subscription Payments and Recurring Services
订阅付款和定期服务
CBDCs could automate recurring payments in subscription-based business models:
Automated Subscription Management: CBDCs could be programmed for regular, automated payments (e.g., streaming services, SaaS platforms), simplifying billing and reducing the risk of service disruptions.
Usage-Based Pricing: CBDCs could support “pay-as-you-go” pricing models where charges are automatically applied based on usage, especially useful for cloud services or utilities.

7. Capital Markets and Wholesale CBDC Use Cases
资本市场和批发 CBDC 用例
For wholesale CBDCs, programmability opens new avenues in capital markets:
Automated Clearing and Settlement: CBDCs could eliminate the need for intermediaries by automatically executing settlements upon matching transaction records between two parties.
Repo and Derivatives Markets: CBDCs can streamline collateral management by automatically adjusting collateral requirements, executing margin calls, or managing repos in real-time based on market fluctuations.

8. Reward Programs and Customer Loyalty
奖励计划和客户忠诚度
Businesses could use programmable CBDCs for customer reward programs:
Automatic Loyalty Points: CBDCs could be programmed to add loyalty points automatically for every purchase, simplifying the customer experience.
Conditional Rewards: Rewards could be programmed to expire or apply only to specific purchases, making it easy to customize loyalty offers for each customer segment.

9. Carbon Credit and Green Finance
碳信用和绿色金融
CBDCs could play a role in incentivizing environmentally sustainable behavior:
Carbon Credit Trading: CBDCs could enable automated carbon credit settlements between companies, enforcing green finance commitments.
Green Rewards: Government programs could incentivize green purchases by programming CBDCs to offer discounts or rewards for sustainable activities, such as using public transport or purchasing eco-friendly products.
These use cases highlight how CBDC programmability could drive efficiencies, automate compliance, and introduce innovative business models across multiple sectors, benefiting both businesses and consumers.

Programmable CBDCs offer interesting possibilities for end users to create custom payment solutions and manage personal finances in new ways. Here are a few examples:

1. Personal Budgeting and Spending Controls
个人预算和支出控制
Automated Savings 自动储蓄: Users could program a portion of their income (e.g., 10%) to automatically transfer to a savings wallet whenever they receive a paycheck, supporting disciplined saving habits.
Category-Based Spending Limits 消费归类: End users could set monthly spending caps for specific categories, such as dining out or entertainment, to better manage their budgets and spending behavior.
Automatic Rounding for Savings 储蓄和消费预估: Each purchase could be rounded up to the nearest dollar, with the “extra” going to a savings or investment account—similar to popular savings apps.

2. Shared Wallets for Families or Groups
家庭或团体共享钱包
Family Allowance System: Parents could set up programmable wallets for children, where funds are released for specific purposes, like school supplies or transportation. Funds could be set to expire if unused within a certain period, encouraging responsible spending.
Household Expense Management: Roommates or couples could create a shared wallet programmed to split common expenses like rent, utilities, or groceries automatically, reducing manual tracking and making shared expenses more transparent.

3. Charitable Donations with Conditions
有条件的慈善捐赠
Conditional Charity Donations: Users could set up automatic donations to charities that activate only when personal income exceeds a certain threshold, allowing them to give back when they are financially able.
Transparent Donations: CBDCs could allow donors to see exactly when and how their funds are used by a charity, increasing transparency and engagement with the causes they support.

4. Emergency Funds and Auto-Trigger Insurance
应急资金和自动触发保险
Self-Triggered Emergency Payments: Users could set up a programmable emergency fund to automatically transfer to their main wallet if their balance falls below a certain level.
Automated Micro-Insurance Payments: End users could set up small automatic payments for emergency health or travel insurance, activating only when they cross country borders or travel a specified distance.

5. Conditional Gifting and Allowances
有条件的赠与和津贴
Smart Gifting: CBDCs could allow users to set up gifts with conditions, such as funds for a child’s education that can only be used for tuition, books, or school supplies.
Goal-Based Allowances: Parents could use programmable CBDCs to set up an allowance system that releases funds to their children only after achieving certain goals, like completing homework or chores.

6. Automated Bill Splitting for Social Activities
社交活动账单自动分摊
Social Wallets: Friends could create a shared, programmable wallet for social events, where each person contributes, and funds are automatically allocated for event-specific expenses, like concert tickets or group dinners.
Real-Time Expense Tracking: Programmed CBDCs could split expenses in real-time as they occur, making group activities financially smoother and removing the need for after-the-fact reimbursements.

7. Customizable Travel Budgets and Currency Conversion
可定制的旅行预算和货币兑换
Vacation Budgeting: Travelers could allocate a specific budget for their trip, where funds automatically convert to the local currency and apply spending limits to ensure they stay within their set vacation budget.
Location-Based Spending: Users could set geographic restrictions on their CBDC wallets, preventing them from spending funds outside a designated area or country, adding an extra layer of control and security for travel budgets.

8. Personal Investment Automations
个人投资自动化
Recurring Investments: End users could program their CBDCs to allocate a small percentage of each paycheck into specific investments or savings accounts, making it easy to automate dollar-cost averaging.
Goal-Based Investment Triggers: Users could set up a CBDC wallet to transfer funds to an investment account only if they’ve met other financial goals for the month, like saving or debt repayment targets.

9. Incentivized Health and Wellness Programs
激励健康和保健计划
Rewards for Healthy Activities: End users could connect programmable CBDCs to health tracking apps to earn micro-payments for activities such as reaching a daily step goal, gym attendance, or purchasing healthy food.
Goal-Based Health Savings: CBDCs could also be used to allocate funds to a “health fund” every time a fitness milestone is reached, rewarding users for making healthy choices.

10. Flexible Subscription Management
灵活的订阅管理
Trial Periods with Expiry: End users could set up subscriptions to only renew if they actively confirm, helping avoid unwanted subscription charges.
Family Subscription Pools: Users could program CBDCs to fund family-wide subscriptions where family members contribute proportionally, or enable automatic payments only if usage metrics meet certain thresholds.

https://github.com/zama-ai/fhevm

fhEVM is a technology that enables confidential smart contracts on the EVM using fully homomorphic encryption (FHE).

  • Solidity integration: fhEVM contracts are simple solidity contracts that are built using traditional solidity toolchains.
  • Simple developer experience: Developers can use the euint data types to mark which part of their contracts should be private.
  • Programmable privacy: All the logic for access control of encrypted states is defined by developers in their smart contracts.
  • High precision encrypted integers : Up to 256 bits of precision for integers
  • Full range of operators : All typical operators are available: +-*/<>==, …
  • Encrypted if-else conditionals : Check conditions on encrypted states
  • On-chain PRNG : Generate secure randomness without using oracles
  • Configurable decryption : Threshold, centralized or KMS decryption
  • Unbounded compute Depth : Unlimited consecutive FHE operations
    Even Circle build a confidential ERC20 on fhEVM - https://github.com/Inco-fhevm/confidential-erc20-framework .
    Let’s deep dive in it:

    Decrypt and reencrypt

    On fhevm blockchain - ZAMA team built, private key is owned by a Key Management Service (KMS). If the plaintext value is needed at some point, there are two ways to obtain it. Both methods are handled by a service called the Gateway.
    fhevm allow explicit decryption requests for any encrypted type. The values are decrypted with the network private key.

    the detail implementation ==> https://docs.zama.ai/fhevm/guides/decrypt

Reencryption is performed on the client side by calling the gateway service using the fhevmjs library.

Zama has another project of FHE on AI — https://github.com/zama-ai/concrete-ml

confidential-erc20

https://www.inco.org/ and Circle publish a framework https://github.com/Inco-fhevm/confidential-erc20-framework which is leveraging on fhEVM:

  • conceals balances.
  • transaction amounts.
  • optional viewing and transfer rules to meet regulatory obligations or enhance programmatic risk management.
  • the counter parties addresses are published on public blockchain.
  • the private key is also configured as kms-service.

https://kosmos.org/ are developing a free, open-source, and user-centric alternative to centralized group chat platforms. They offer https://kosmos.org/projects/:

1) Kosmos Accounts & Services

Kosmos Accounts give people access to Kosmos hosted services.

2) Kosmos Chat

Kosmos Chat is a group chat application. All of its components can be either self-hosted or connected to hosted services. No user data is ever locked into hosted silos.

3) Kredits — https://kredits.kosmos.org/dashboard

Kredits are a system for tracking opensource project contributions, enabling and facilitating the fair and transparent use of project funds, as well as improving project management and governance.
https://wiki.kosmos.org/Kredits

High-level overview

Similar projects/ideas

  1. https://colony.io/ — Colony is a DAO which exists to make it easy for others to build DAOs.
    How Colony Makes Money
  • The Colony Network levies a small fee on Payments leaving a colony to an external address.
  • Fees paid in whitelisted tokens like USDC, USDT, WETH or xDAI go to the Metacolony to incentivise contributors.
  • Fees paid in other ERC20 tokens go to auctions where token buyers can purchase ERC20 tokens using CLNY, which is burned.
  1. https://github.com/Commonfare-net/macao-social-wallet , https://freecoin.dyne.org/ — Freecoin is a set of tools to let people run reward schemes that are transparent and auditable to other organisations. It is made for participatory and democratic organisations who want to incentivise participation, unlike centralised banking databases.

  2. https://giveth.io/ — Support global projects in the fields of public goods, sustainability and regeneration through cryptocurrency donations. https://github.com/Giveth

  3. https://www.gitcoin.co/ — Gitcoin Grants Program, we’ve distributed over $60M to early stage builders championing projects across DeFi, climate, open source and beyond.

  4. https://shapeshift.com/ — ShapeShift champions the principles of permissionless access, trustless operations, privacy, and non-custodial asset management, providing users with a secure and autonomous digital currency management experience. ShapeShift supports 150+ different wallets including MetaMask, Ledger, xDeFi, WalletConnect, Coinbase, and Keplr.

  5. https://activitypods.org/ , https://github.com/activitypods/activitypods — Solid (Social Linked Data) is a set of specifications whose aim is to allow users to store all their data in Pods (“Personal Online Datastores”). Users have full control over their Pods and can give permissions to applications or people they trust. https://solidproject.org/

  6. https://www.hyphanet.org/ , https://github.com/hyphanet/fred — a peer-to-peer platform for censorship-resistant and privacy-respecting publishing and communication.